news 2026/1/25 6:18:16

基于.Net 8创建 CAD勘测定界图(三)——界址点标注+边长标注

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于.Net 8创建 CAD勘测定界图(三)——界址点标注+边长标注

好的,之前的两篇文章大概介绍了一下关于做这个功能的背景和关于Aspose.CAD For .Net填充无效,转用ACadSharp创建红线和界址点符号的内容,具体看:
基于.Net 8创建 CAD勘测定界图(一)
基于.Net 8创建 CAD勘测定界图(二)
那么在这个地方就不多描述了,直接进入正题

界址点文字标注创建

做过CAD、Bentley这些或者经常使用这种测量软件的基本也都清楚,一个完整的界址点标注理论上应该是下面这样子的:

之前创建了下面的图形符号,那么就该创建界址点的文字标注了。

  • Step1:创建文字
    这个比较明确,添加TextEntity就行,具体设置看个人喜好,插入点是左下(默认标准)还是其他(自定义)反正都OK。
    直接代码使用如下:

    vartext=newTextEntity{Value=textValue,// 文本内容InsertPoint=initialAnchor,// 插入点AlignmentPoint=initialAnchor,// 对其点Color=newColor(255,255,255),// 字体颜色Height=9.5,// 字体高度HorizontalAlignment=TextHorizontalAlignment.Right,// 水平对齐方式VerticalAlignment=TextVerticalAlignmentType.Top,// 竖直对齐方式Layer=jzdbzLayer,// 所在层Style=textStyle};

    到了这个地方,参数又多出来两个,一个是Style一个是Layer
    Style决定了你文字的样式是否支持中文,在打开CAD的时候记得会有一个窗口提示你文字替换或者未找到对应SHX什么的,如果不设置,打开的中文有一些就是?的符号。

  • Step2:创建Style

    // 创建SimSun样式varsimsun=doc.TextStyles.Contains("SimSun")?doc.TextStyles["SimSun"]:newACadSharp.Tables.TextStyle("SimSun"){Filename="simsun.ttf",BigFontFilename="simsun.ttc"};if(!doc.TextStyles.Contains("SimSun")){doc.TextStyles.Add(simsun);}// 提升中文兼容性doc.Header.CodePage="ANSI_936";// 简体中文代码页doc.Header.ExtendedNames=true;
  • Step3:创建Layer

    varlayer=doc.Layers.Contains(layerName)?doc.Layers[layerName]:null;if(layer!=null){// 可选更新颜色(必须是具体颜色,不能是 ByLayer/ByBlock)if(color.HasValue){layer.Color=color.Value;}returnlayer;}// 不存在则创建layer=newACadSharp.Tables.Layer(layerName){// 颜色必须是具体颜色,否则会抛 ArgumentExceptionColor=color??newColor(7)// 默认白色(ACI 7),若需 TrueColor 可用 new Color(255,255,255)};doc.Layers.Add(layer);

    这段代码在后面用到很多,所以直接封装一个Function:

    /// <summary>/// 创建图层/// </summary>/// <param name="doc"></param>/// <param name="layerName"></param>/// <param name="color"></param>/// <returns></returns>privateACadSharp.Tables.LayerGetOrCreateLayer(CadDocumentdoc,stringlayerName,Color?color=null){// 已存在直接返回varlayer=doc.Layers.Contains(layerName)?doc.Layers[layerName]:null;if(layer!=null){// 可选更新颜色(必须是具体颜色,不能是 ByLayer/ByBlock)if(color.HasValue){layer.Color=color.Value;}returnlayer;}// 不存在则创建layer=newACadSharp.Tables.Layer(layerName){// 颜色必须是具体颜色,否则会抛 ArgumentExceptionColor=color??newColor(7)// 默认白色(ACI 7),若需 TrueColor 可用 new Color(255,255,255)};doc.Layers.Add(layer);returnlayer;}

    到了这一步图层也就创建好了。结合第一步的创建文字,文字的所在图层、样式、颜色全部设置完成。

界址点的位置

这东西说的明白一点,界址点文字肯定是不能落在红线范围内的,也就是说,界址点文字的偏移量是你可以自定义的,但是位置需要根据偏移后的位置是否落在红线内进行判断,然后看看是不是要做Mirror之类的。知道这个前提,就开始指定插入点就好。

  • Step1:基准点
    基准点之前就说过,以红线Coordinate的坐标作为基准,文字对齐一般是左下,偏移量自己指定,一般我给的是:

    newXY(10,10)

    也就是X、Y方向各正向偏移10个单位。

    varoriginPt=newXY(polyLine.Coordinates[i].X,polyLine.Coordinates[i].Y);varoffset=newXY(10,10);varinsertPt=originPt+offset;
  • Step2:判断偏移点是否在红线内
    这个没啥多说的,直接上代码

    /// <summary>/// 判断点是否在多边形内/// </summary>/// <param name="point">文本anchor点</param>/// <param name="polygon">cad lwpolyline</param>/// <returns></returns>privateboolIsPointInPolygon(XYZpoint,LwPolylinepolygon){varvertices=polygon.Vertices;varlinarRing=newLinearRing(vertices.Select(v=>newCoordinate(v.Location.X,v.Location.Y)).ToArray());varpolygonNts=newPolygon(linarRing);varpointNts=newNetTopologySuite.Geometries.Point(point.X,point.Y);returnpolygonNts.Covers(pointNts);}

    这个之所以不用polygonNts.Contains(pointNts);的原因很简单,偏移后的点可能刚好在多边形的边上是吧?

  • Step3:重算偏移点
    Mirror么,initialAnchor = new XYZ(center.X - delta.X * 1.75, center.Y - delta.Y * 1.75, 0);为了确定挪走了,在给个系数1.75
    结合上面3个步骤,直接创建对应的方法,大段代码就不贴了,反正核心就是:

// 文本初始设置:右上角位置,左下角对齐vardelta=offset??newXY(1,1);varinitialAnchor=newXYZ(center.X+delta.X,center.Y+delta.Y,0);varjzdbzLayer=GetOrCreateLayer(doc,"JieZhiDianBiaoZhu",newColor(255,255,255));if(IsPointInPolygon(initialAnchor,polygon)){initialAnchor=newXYZ(center.X-delta.X*1.75,center.Y-delta.Y*1.75,0);vartext=newTextEntity{Value=textValue,InsertPoint=initialAnchor,AlignmentPoint=initialAnchor,Color=newColor(255,255,255),Height=9.5,HorizontalAlignment=TextHorizontalAlignment.Right,VerticalAlignment=TextVerticalAlignmentType.Top,Layer=jzdbzLayer};entList.Add(text);}else{vartext=newTextEntity{Value=textValue,InsertPoint=initialAnchor,AlignmentPoint=initialAnchor,Color=newColor(255,255,255),Height=9.5,HorizontalAlignment=TextHorizontalAlignment.Left,VerticalAlignment=TextVerticalAlignmentType.Bottom,Layer=jzdbzLayer};entList.Add(text);}doc.ModelSpace.Entities.AddRange(entList);

结合前面文章说到的创建界址点符号,结合这个内容,封一个方法就行,总之,按照这个方法创建的界址点效果如下:

边长标注

上面说完了如何创建界址点,接下来就是边长标注了,步骤大致和之前一样,只不过多了个旋转,因为角度是要跟着边的K变化的。

指定偏移量
创建文本
偏移后的文本是否在红线内
重新计算偏移量
文本创建
计算旋转角
旋转文本

按照这个步骤,之前的不说,直接开始计算旋转角

  • Step1:计算方向向量和角度:

    vardir=vEnd-vStart;// 方向向量:从起点指向终点varangle=Math.Atan2(dir.Y,dir.X)>0?Math.Atan2(dir.Y,dir.X)+Math.PI:Math.Atan2(dir.Y,dir.X);

    dir:简单说,就是这条线的“方向”(比如向右是 (1,0),向下是 (0,1))。
    angle:用 Math.Atan2 算出这个方向的角度(弧度)。Math.Atan2 默认是“数学坐标系”(y轴向上)。

  • Step2:计算法线方向(左法线)

    // 法线方向(左法线)varnormalAngle=angle+MathHelper.HalfPI;
  • Step3:标签位置

    varlabelPos=Math.Atan2(dir.Y,dir.X)>0?XY.Polar(mid,offset*(-3.5),normalAngle):XY.Polar(mid,offset,normalAngle);

    XY.Polar(mid, offset, normalAngle):从 mid(中点)出发,沿 normalAngle(法线方向)偏移 offset 距离,算出标签坐标。

最后创建文字:

// 创建文字(居中对齐)vartext=newTextEntity{Value=textMeters,AlignmentPoint=labelPos.Convert<XYZ>(),InsertPoint=labelPos.Convert<XYZ>(),Rotation=angle,// 与边斜率一致Height=5.5,// 控制文字大小HorizontalAlignment=TextHorizontalAlignment.Center,VerticalAlignment=TextVerticalAlignmentType.Middle,Layer=bcbzLayer};

还是如果需要,那么封装方法,最后添加完的边长标注效果如下:

以上,本篇到此结束,下一篇就觉得写怎么创建小图斑的斜线填充和标注了……

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/25 2:12:36

彩笔运维勇闯机器学习--孤立森林

孤立森林&#xff0c;一种非常高效快速的异常检测算法开始探索scikit-learnimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.ensemble import IsolationForestrng np.random.RandomState(0)X_train 0.3 * rng.randn(100, 2)X_outliers rng.uniform(low-2, h…

作者头像 李华
网站建设 2026/1/25 2:18:12

AI会议管理神器:如何用AI Deadlines轻松追踪全球学术会议?

AI会议管理神器&#xff1a;如何用AI Deadlines轻松追踪全球学术会议&#xff1f; 【免费下载链接】ai-deadlines :alarm_clock: AI conference deadline countdowns 项目地址: https://gitcode.com/gh_mirrors/ai/ai-deadlines 作为一名AI研究者&#xff0c;你是否曾经…

作者头像 李华
网站建设 2025/12/25 3:45:07

5天变板砖!豆包手机助手为何被集体“避雷”?

一、从爆火到被封&#xff0c;只用了5天 上周&#xff0c;字节跳动旗下AI助手“豆包”和中兴联合推出的这款努比亚工程机&#xff0c;3499元的价格&#xff0c;某鱼被炒到上万还一机难求。为啥这么火&#xff1f;因为它真的太方便了&#xff01;你给手机看商品图&#xff0c;说…

作者头像 李华
网站建设 2026/1/23 17:31:32

中小学AI教育终极指南:创新课程完整部署方案

中小学AI教育终极指南&#xff1a;创新课程完整部署方案 【免费下载链接】ai-edu-for-kids 面向中小学的人工智能通识课开源课程 项目地址: https://gitcode.com/datawhalechina/ai-edu-for-kids 项目愿景与教育理念 在人工智能技术飞速发展的时代&#xff0c;培养青少…

作者头像 李华
网站建设 2026/1/2 10:53:29

轻量级Markdown查看器Markn:重新定义文档预览体验

轻量级Markdown查看器Markn&#xff1a;重新定义文档预览体验 【免费下载链接】markn Lightweight markdown viewer. 项目地址: https://gitcode.com/gh_mirrors/ma/markn 在数字化工作日益普及的今天&#xff0c;Markdown已成为技术文档、博客写作和笔记整理的首选格式…

作者头像 李华
网站建设 2026/1/20 1:33:40

IEC101设备数据 转 IEC104项目案例

1 案例说明 设置网关采集IEC101设备数据把采集的数据转成IEC104协议转发给其他系统。 2 准备工作仰科网关。支持采集IEC101设备数据&#xff0c;IEC104协议转发。电脑。IP设置成192.168.1.198&#xff0c;和网关在同一个网段。网线、12V电源。 3 配置VFBOX网关采集101设备数据安…

作者头像 李华