首页 > 其他分享 >Revit二次开发-用GDI+绘制线样式

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

时间:2023-08-01 11:35:45浏览次数:38  
标签:graphics Revit var new 二次开发 GDI 绘制 actualWidth rectangle

  最近有个需求就是将动态讲当前文档中的线样式绘制出来,并且显示在自己的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;
        }
    }

标签:graphics,Revit,var,new,二次开发,GDI,绘制,actualWidth,rectangle
From: https://www.cnblogs.com/youngala/p/17596016.html

相关文章

  • Revit二次开发-获取族类型以及族参数值
      在族环境中获取当前族的所有族类型以及族类型对应的所有参数和参数值。直接上代码~publicoverrideResultExecute(ExternalCommandDatacommandData,refstringmessage,ElementSetelements){vardoc=commandData.Application.ActiveUIDocument......
  • Revit二次开发之 Material 分析
    对于revit来说,任何Element都可以包含一个或者多个Material,其通过方法:publicICollection<ElementId>GetMaterialIds(boolreturnPaintMaterials)获取指定元素的材质集合,如果为true,则返回“绘制”工具指定给元素面的材质ID。如果为false,则返回通过材质的几何体或复合结......
  • CAD二次开发之 会旋转的彩色风车
      ///<summary>///会旋转的风车///</summary>[CommandMethod("RotatingFan")]publicvoidRotatingFan(){vardoc=Application.DocumentManager.MdiActiveDocument;vardb......
  • GDI+区域(Region)排除与路径(GraphicsPath)叠加透明
    1、区域(Region)排除 1CRectrt;2GetClientRect(&rt);34GraphicsPathpa;5pa.AddEllipse(0,0,rt.Width(),rt.Height());6Regionrg(Rect(0,0,rt.Width(),rt.Height()));7rg.Exclude(&pa);8graphics.FillRegion(&SolidBrush(Color(255,0,......
  • GDI+画刷(LinearGradientBrush(三))
    3、LinearGradientBrush(Rect&,Color&,Color&,LinearGradientMode)对四种路径渐变方式进行代码效果展示,如下:变量定义:CDCMemDCIndicator;CBitmapMemBitmapIndicator;CDC*pDC;CComboBoxm_pGradientMode;关键代码:1voidLinearGradientTwoDlg::DoDataE......
  • Revit二次开发之 PolymeshTopology
    PolymeshTopology 表示多边形网格拓扑的类,用于描述多边形的的图形信息。多边形网格的拓扑结构由多个点和由这些点形成的三角形面组成。每个方面由点阵列的三个索引来确定。多边形网格可以指定UV坐标,并且始终至少关联一个法线。非平面多边形网格可能有一个以上的法线可用;多边形网......
  • GDI+画刷(LinearGradientBrush(二))
    2、LinearGradientBrush(Rect&,Color&,Color&,REAL,BOOL),代码演示结果如下所示:注:Rect规定画刷一次所绘制的范围,REAL值是指定颜色渐变的方向变量定义:1CDCMemDCIndicator;2CBitmapMemBitmapIndicator;3CDC*pDC;45REALm_pRealValue;6CSliderCtrlm_pSlid......
  • GDI+画刷(HatchBrush)
    HatchBrush在构造过程中需要指定画刷类型、前景色、后景色三项内容,其中画刷类型在官方文档中给出的枚举类型如下所示:1typedefenumHatchStyle{2HatchStyleHorizontal,3HatchStyleVertical,4HatchStyleForwardDiagonal,5HatchStyleBackwardDiagonal,6Hatc......
  • Revit二次开发-创建用户只读的共享参数
      在族环境里面绑定共享参数,并且用户在属性面板不可修改参数值[Transaction(TransactionMode.Manual)]publicclassSharedParameters:IExternalCommand{privatereadonlystring_desktop=Environment.GetFolderPath(Environment.SpecialFolder.Desk......
  • GDI+颜色(Color)
    构造方法1:Color::Color(BYTEr,BYTEg,BYTEb)构造方法中三个参数分别为RGB值,取值范围(0-255),下面代码呈现在RGB取值下进行线的绘制: 1Graphicsgraphics(dc);23Colorclr(255,0,0);4Colorclg(0,255,0);5Colorclb(0,0,255);67Penpr(clr,2.0......