赶集网网站建设分析网站建设新手看什么书
2026/3/2 1:21:23 网站建设 项目流程
赶集网网站建设分析,网站建设新手看什么书,phpcms 怎么做网站,作风建设年活动网站好的#xff0c;之前的两篇文章大概介绍了一下关于做这个功能的背景和关于Aspose.CAD For .Net填充无效#xff0c;转用ACadSharp创建红线、界址点符号、界址点标注以及边长标注的方法#xff0c;具体看#xff1a; 基于.Net 8创建 CAD勘测定界图#xff08;一#xff09…好的之前的两篇文章大概介绍了一下关于做这个功能的背景和关于Aspose.CAD For .Net填充无效转用ACadSharp创建红线、界址点符号、界址点标注以及边长标注的方法具体看基于.Net 8创建 CAD勘测定界图一基于.Net 8创建 CAD勘测定界图二基于.Net 8创建 CAD勘测定界图三那么接下来我们一步一步开始添加对应的图斑填充和拉线标注图斑填充图斑填充的效果要求是实现下图的效果那么基于这个需求直接开搞就得了首先先确认填充样式是下图的这个这里要注意啊是ANSI31而不是ANS131反正当时第一时间被这个编码折腾了挺久的。那么知道了这个的样式步骤和之前创建界址点的填充模式一样甚至比之前的界址点创建还要简单。绘制轮廓创建路径获取样式填充保存OK那么先来第一步上传的矢量文件中已经有现成的Polygon或者MultiPolygon了拿到这个要素转成CAD的LwPolyline我个人比较习惯这个而不是Ployline没记错的话应该是从AutoCAD大概12以后官方都比较推荐这个做2D如果需要有Z值的还是乖乖PolyLine比较靠谱。Step1.创建边界多段线varcoordssonItem.SonGeometry.Coordinates;// 坐标NTSvarpltListcoords.Select(cnewXY(c.X,c.Y)).ToList();// 点集ListvarlwPolylineBuildRedPolyline(pltList);// 创建LwPolyLinelwPolyline.ColornewColor(255,255,255);// 设置颜色lwPolyline.ConstantWidth0.03;// 线宽lwPolyline.LayerxzLayer;// 图层doc.ModelSpace.Entities.Add(lwPolyline);这里面有个自己的 FunctionBuildRedPolyline主要就是读取坐标点转CAD的过程之前代码应该也贴过了就不重复水了Step2.绑定路径路径和之前一样varboundaryPolylinenewHatch.BoundaryPath.Polyline(lwPolyline.Vertices.Select(vnewXYZ(v.Location.X,v.Location.Y,v.Bulge)),isClosed:lwPolyline.IsClosed);varpathnewHatch.BoundaryPath();path.Edges.Add(boundaryPolyline);Step3.填充varpatternnewHatchPattern(ANSI31);pattern.Lines.Add(newHatchPattern.Line{AngleMathHelper.DegToRad(45.0),BasePointnewXY(0,0),// PAT 格式中 offset 是沿线法向的重复偏移这里直接给出等效的重复向量OffsetnewXY(0,10),// 行距为 1PatternScale 会整体缩放// ANSI31 通常为实线不需要 dash 断续如果需要虚线可设置 DashLengths// DashLengths { 4.0, -2.0 }});varhatchnewHatch{IsSolidfalse,ColornewColor(255,255,255),Patternpattern,PatternTypeHatchPatternType.PatternFill,PatternScale1.0,PatternAngle0.0,LayerxzLayer};hatch.Paths.Add(path);// 添加至少一个位于边界内部的种子点例如多边形质心或任意内部点varcentroidlwPolyline.Vertices.Select(vv.Location).Aggregate(newXY(0,0),(acc,p)newXY(acc.Xp.X,acc.Yp.Y));centroidnewXY(centroid.X/lwPolyline.Vertices.Count,centroid.Y/lwPolyline.Vertices.Count);hatch.SeedPoints.Add(centroid);这里强调种子点添加很重要种子点添加很重要种子点添加很重要重要的事情讲3遍如果不添加内部种子点你的填充很有可能失效几率不明我测了60几次遇到过10多次概率不低。到这里所有关于图斑填充的问题结束。创建出来的图斑填充效果如下至于为什么是白色的因为每个填充按照不同类型进行填充我只是用了new Color(255,255,255) // White示例具体各位需要什么颜色请使用各位自定义的颜色配置。拉线标注中心标注我得到的需求是A .小的填充图斑在红线内B. 红线图斑需要中心标注C. 小的填充图斑需要拉线标注基于这三个需求开始分别实现拉线标注及中心标注需要标注的状态示意如下分析一下下面地类名称上面地块编号 面积可以有2种做法A .上面的创建下划线文本 文本拼接 按位置需求创建下方文本B. 创建LwPolyLine 创建上方文本创建下方文本这里说明我使用的是方法B拉线标注按照上面的B方法先拉线首先获取需要拉线标注的元素中心点varentListnewListEntity();varsonGeomsonItem.SonGeometry;varcenterPointsonGeom.Centroid;计算终点varrightPointnewNetTopologySuite.Geometries.Point(centerPoint.X98,centerPoint.Y);varrightLinenewNetTopologySuite.Geometries.LineString([newCoordinate(rightPoint.X-40,rightPoint.Y),newCoordinate(rightPoint.X,rightPoint.Y),newCoordinate(rightPoint.X40,rightPoint.Y)]);varleftPointnewNetTopologySuite.Geometries.Point(centerPoint.X-98,centerPoint.Y);varleftLinenewNetTopologySuite.Geometries.LineString([newCoordinate(leftPoint.X-40,leftPoint.Y),newCoordinate(leftPoint.X,leftPoint.Y),newCoordinate(leftPoint.X40,leftPoint.Y)]);varupPointnewNetTopologySuite.Geometries.Point(centerPoint.X,centerPoint.Y98);varupLinenewNetTopologySuite.Geometries.LineString([newCoordinate(upPoint.X-40,upPoint.Y),newCoordinate(upPoint.X,upPoint.Y),newCoordinate(upPoint.X40,upPoint.Y)]);vardownPointnewNetTopologySuite.Geometries.Point(centerPoint.X,centerPoint.Y-98);vardownLinenewNetTopologySuite.Geometries.LineString([newCoordinate(downPoint.X-40,downPoint.Y),newCoordinate(downPoint.X,downPoint.Y),newCoordinate(downPoint.X40,downPoint.Y)]);我个人比较懒正常应该是一个动态计算斜率k的终点线我直接上下左右了。反正原理是这样需要计算的朋友可以自己设置斜率哈。方向判断按照刚刚创建的4条线判断哪个方向是最合适的标注应在红线外。varcandidatesnewDictionarystring,(NetTopologySuite.Geometries.Point pt,boolinside,XY target){[right](rightPoint,fStruct.Geometry.Intersects(rightLine),newXY(rightPoint.X,rightPoint.Y)),[left](leftPoint,fStruct.Geometry.Intersects(leftLine),newXY(leftPoint.X,leftPoint.Y)),[up](upPoint,fStruct.Geometry.Intersects(upLine),newXY(upPoint.X,upPoint.Y)),[down](downPoint,fStruct.Geometry.Intersects(downLine),newXY(downPoint.X,downPoint.Y)),[center](centerPoint,true,newXY(centerPoint.X,centerPoint.Y))};// 找到未包含的方向若恰有一个为 false则选该方向varnotInsidecandidates.Where(kv!kv.Value.inside).Select(kvkv.Key).ToList();varlineCenterPtnewXY();vardirnotInside.Count!0?notInside[0]:center;lineCenterPtcandidates[dir].target;仍旧日常偷懒选哪个方向最好应该是可以计算的反正我还是一个字懒。创建文字间的横线知道了刚刚创建的多段线的终点把终点作为横线的终点创建横线线长按需varconnectLinenewLwPolyline(){ColornewColor(255,255,255),ConstantWidth0.3,IsClosedfalse,Layerlayer};connectLine.Vertices.Add(newLwPolyline.Vertex(newXY(centerPoint.X,centerPoint.Y)));connectLine.Vertices.Add(newLwPolyline.Vertex(newXY(lineCenterPt.X7.5,lineCenterPt.Y)));entList.Add(connectLine);创建文字创建文字的时候注意中心对齐哈varupAreaMath.Round(sonGeom.Area/10000.0,4);vartextUpnewTextEntity{Value${fStruct.DkId}{upArea:F4}hm²,InsertPointnewXYZ(lineCenterPt.X-30,lineCenterPt.Y3,0),AlignmentPointnewXYZ(lineCenterPt.X-30,lineCenterPt.Y3,0),ColornewColor(255,255,255),Height6.5,HorizontalAlignmentTextHorizontalAlignment.Center,VerticalAlignmentTextVerticalAlignmentType.Middle,Layerlayer};下方文字创建道理同上Y坐标减去对应值就可以。到这里拉线标注创建完成。中心标注道理和拉线标注一样只不过这次不用创建拉线了直接用NTS或者ACadSharp的元素Center或Centriod都可以这个点作为文字中间横线的中点。创建方法和之前一样最终效果结合之前的3篇文章创建出来的效果如下好了到这里打印基本大差不差了下一篇估计就是最后且最麻烦的一篇打印图廓了有时间再写吧……就这样债见。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询