Revit二次开发-用GDI+绘制线样式
最近有个需求就是将动态讲当前文档中的线样式绘制出来,并且显示在自己的UI上。查阅了一下api文档以及吉米大佬的博客,并且这篇博客中受到启发 填充样式绘制
然后自己琢磨了一下,成功将线样式绘制出来了。 但是目前有个问题就是圆点我在dash pattern里面设置的是1f的单位,如果图片放大看的话是个小矩形,目前还未找到好的方法处理。我在这里抛砖引玉,希望有大佬研究出完美的绘制方案。 下面是代码和效果图
[Transaction(TransactionMode.Manual)]
internal class DashLine : IExternalCommand
{
private readonly string _desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
var doc = commandData.Application.ActiveUIDocument.Document;
using (var collector = new FilteredElementCollector(doc))
using (var filter = new ElementClassFilter(typeof(LinePatternElement)))
{
var elems = collector.WherePasses(filter).OfType<LinePatternElement>();
var pen = new Pen(System.Drawing.Color.Black);
foreach (var item in elems)
{
try
{
var filePath = Path.Combine(_desktop, $"{item.Name}.bmp");
var linePattern = LinePatternElement.GetLinePattern(doc, item.Id);
var actualWidth = 400;
var actualHeight = 50;
var image = new Bitmap(actualWidth, actualHeight);
if (linePattern?.IsValidObject ?? false)
{
using (var graphics = Graphics.FromImage(image))
{
var dashPattern = linePattern.GetSegments().Select(s => s.Type == LinePatternSegmentType.Dot ? 1f : Convert.ToSingle(s.Length * 304.8));
var rectangle = new System.Drawing.Rectangle(0, 0, actualWidth, actualHeight);
var orginX = rectangle.Left + rectangle.Width / 2;
var orginY = rectangle.Top + rectangle.Height / 2;
graphics.TranslateTransform(orginX, orginY);
var rect = new System.Drawing.Rectangle(-(actualWidth / 2), -(actualWidth / 2), (int)actualWidth, actualWidth);
graphics.FillRectangle(Brushes.White, rect);
graphics.ResetTransform();
orginX = rectangle.Left;
orginY = rectangle.Top + rectangle.Height / 2;
pen.DashPattern = dashPattern.ToArray();
graphics.TranslateTransform(orginX, orginY);
graphics.DrawLine(pen, 0f, 0f, 400f, 0f);
}
image.Save(filePath, System.Drawing.Imaging.ImageFormat.Bmp);
}
}
catch (Exception)
{
throw;
}
}
}
return Result.Succeeded;
}
}