Revit二次开发-用GDI+绘制线样式

发布时间 2023-08-01 11:28:49作者: 热情定无变

  最近有个需求就是将动态讲当前文档中的线样式绘制出来,并且显示在自己的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);
                float[] pattern = new float[] { 0.5f, 2f }; ;
                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;
        }
    }