public void autoca() { var doc = Application.DocumentManager.MdiActiveDocument; var db = HostApplicationServices.WorkingDatabase; var ed = doc.Editor; try { var per1 = ed.GetEntity("选择测试设备:\n"); if (per1.Status != PromptStatus.OK) { return; } using (var tr = doc.TransactionManager.StartTransaction()) { var bt = (BlockTable)(tr.GetObject(db.BlockTableId, OpenMode.ForRead)); var btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite); var ent1 = tr.GetObject(per1.ObjectId, OpenMode.ForRead) as Entity; if (ent1 == null) { return; } if (ent1 is Polyline) { var pp = ent1 as Polyline; ed.WriteMessage(pp.Closed); ed.WriteMessage("\n"); } else if (ent1 is BlockReference) { var rr = ent1.Clone() as BlockReference; if (rr != null) { // 记录当前角度 var rolat = rr.Rotation; // 把角度设置为0 rr.Rotation = 0; // 得到角度为0的实体范围 var ext = rr.GeometricExtents; // 生成一个测试矩形,颜色为黄色 var pl = new Polyline(); pl.CreateRectangle(new Point2d(ext.MaxPoint.X, ext.MaxPoint.Y), new Point2d(ext.MinPoint.X, ext.MinPoint.Y)); pl.ColorIndex = 2; // 旋转实体范围 Matrix3d mt = Matrix3d.Rotation(rolat, Vector3d.ZAxis, GeTools.MidPoint(ext.MaxPoint, ext.MinPoint)); pl.TransformBy(mt); // 加入到模型空间 btr.AppendEntity(pl); tr.AddNewlyCreatedDBObject(pl, true); } } tr.Commit(); } } catch (Exception ex) { ed.WriteMessageWithReturn(ex); } }
//移动夹点 public override void MoveGripPointsAt(Entity entity, GripDataCollection grips, Vector3d offset, MoveGripPointsFlags bitFlags) { var ismove = false; foreach (GripData gd in grips) { if (gd is UserGripData && ismove == false) { //UserGripData lagd = (UserGripData)gd; if (entity is BlockReference) { var brf = entity as BlockReference; brf.Position = brf.Position.Add(offset); } else if (entity is DBText) { var txt = entity as DBText; txt.Position = txt.Position.Add(offset); txt.AlignmentPoint = txt.AlignmentPoint.Add(offset); } else if (entity is MText) { var txt = entity as MText; txt.Location = txt.Location.Add(offset); } ismove = true; } } if (grips.Count > 0) { if (entity is BlockReference) { if (!ismove) { base.MoveGripPointsAt(entity, grips, offset, bitFlags); } mpt1 = pt1.Add(offset); mpt2 = pt2.Add(offset); pt = GeTools.MidPoint(mpt1, mpt2); } else if (entity is DBText) { if (!ismove) { base.MoveGripPointsAt(entity, grips, offset, bitFlags); } pt = ((DBText)entity).Position; } else if (entity is MText) { if (!ismove) { base.MoveGripPointsAt(entity, grips, offset, bitFlags); } pt = ((MText)entity).Location; } } }
public void Dimtest() { //创建要标注的图形 Line line1 = new Line(new Point3d(30, 20, 0), new Point3d(120, 20, 0)); Line line2 = new Line(new Point3d(120, 20, 0), new Point3d(120, 40, 0)); Line line3 = new Line(new Point3d(120, 40, 0), new Point3d(90, 80, 0)); Line line4 = new Line(new Point3d(90, 80, 0), new Point3d(30, 80, 0)); Arc arc = new Arc(new Point3d(30, 50, 0), 30, Math.PI / 2, Math.PI * 3 / 2); Circle cir1 = new Circle(new Point3d(30, 50, 0), Vector3d.ZAxis, 15); Circle cir2 = new Circle(new Point3d(70, 50, 0), Vector3d.ZAxis, 10); Entity[] entities = new Entity[] { line1, line2, line3, line4, arc, cir1, cir2 }; List <Dimension> dims = new List <Dimension>(); RotatedDimension dimRotated1 = new RotatedDimension(); dimRotated1.XLine1Point = line1.StartPoint; dimRotated1.XLine2Point = line1.EndPoint; dimRotated1.DimLinePoint = GeTools.MidPoint(line1.StartPoint, line1.EndPoint) .PolarPoint(-Math.PI / 2, 10); dimRotated1.DimensionText = "<>mm"; dims.Add(dimRotated1); //转角标注(垂直) RotatedDimension dimRotated2 = new RotatedDimension(); dimRotated2.Rotation = Math.PI / 2; dimRotated2.XLine1Point = line2.StartPoint; dimRotated2.XLine2Point = line2.EndPoint; dimRotated2.DimLinePoint = GeTools.MidPoint( line2.StartPoint, line2.EndPoint) .PolarPoint(0, 10); dims.Add(dimRotated2); //转角标注(尺寸公差标注) RotatedDimension dimRotated3 = new RotatedDimension(); dimRotated3.XLine1Point = line4.StartPoint; dimRotated3.XLine2Point = line4.EndPoint; dimRotated3.DimLinePoint = GeTools.MidPoint( line4.StartPoint, line4.EndPoint).PolarPoint( Math.PI / 2, 10); dimRotated3.DimensionText = TextTools.StackText( "<>", "+0.026", "-0.025", StackType.Tolerance, 0.7); dims.Add(dimRotated3); entities.ToSpace(); }
public void TendonAnnotation() { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; using (Transaction trans = db.TransactionManager.StartTransaction()) { //1.选择梁顶缘线 PromptEntityOptions tpLineOpt = new PromptEntityOptions("\n选择梁顶缘线"); tpLineOpt.SetRejectMessage("\n顶缘线应为直线、圆弧或多段线"); tpLineOpt.AddAllowedClass(typeof(Line), true); //可以选择直线 tpLineOpt.AddAllowedClass(typeof(Polyline), true); //可以选择多段线 tpLineOpt.AddAllowedClass(typeof(Arc), true); //可以选择圆弧线 PromptEntityResult tpLineRes = ed.GetEntity(tpLineOpt); if (tpLineRes.Status != PromptStatus.OK) { return; } ObjectId tpLineId = tpLineRes.ObjectId; Curve tpLine = trans.GetObject(tpLineId, OpenMode.ForRead) as Curve; //2.选择钢束线 PromptEntityOptions tdLineOpt = new PromptEntityOptions("\n选择钢束"); tdLineOpt.SetRejectMessage("\n钢束应为多段线"); tdLineOpt.AddAllowedClass(typeof(Polyline), true);//仅能选择多段线 PromptEntityResult tdLineRes = ed.GetEntity(tdLineOpt); if (tdLineRes.Status != PromptStatus.OK) { return; } ObjectId tdLineId = tdLineRes.ObjectId; Polyline tdLine = trans.GetObject(tdLineId, OpenMode.ForRead) as Polyline; //判断钢束线是否在顶缘线以内,否则报错返回 if (tdLine.StartPoint.X < tpLine.StartPoint.X || tdLine.EndPoint.X > tpLine.EndPoint.X) { Application.ShowAlertDialog("钢束线超出顶缘线,请检查!"); return; } //3.设置绘图参数 //3.1 绘图比例 PromptDoubleOptions scaleOpt = new PromptDoubleOptions($"\n设置绘图比例<{scale}>"); scaleOpt.AllowNone = true; //允许回车,则采用前次比例 scaleOpt.AllowNegative = false; //不允许负值 scaleOpt.AllowZero = false; //不允许零值 PromptDoubleResult scaleRes = ed.GetDouble(scaleOpt); //获取比例 if (scaleRes.Status != PromptStatus.OK && scaleRes.Status != PromptStatus.None) { return; } else if (scaleRes.Status == PromptStatus.OK) { scale = scaleRes.Value; } //3.2 尺寸标注绘图位置 PromptPointOptions posOpt = new PromptPointOptions("\n设置标注线位置"); PromptPointResult posRes = ed.GetPoint(posOpt); if (posRes.Status != PromptStatus.OK) { return; } Point3d pos = posRes.Value; //4.开始建立标注 List <Point3d> ptsH = new List <Point3d>(); //创建水平标注点集 List <Dimension> dims = new List <Dimension>(); //创建标注集,存放各类标注 for (int i = 0; i < tdLine.NumberOfVertices - 1; i++) { //4.1 水平点集 ptsH.Add(tdLine.GetPoint3dAt(i)); //4.2 每段钢束线的长度 //4.3 直线标注角度 //4.4 圆弧线标注半径 if (tdLine.GetSegmentType(i) == SegmentType.Line) { LineSegment3d lineSeg = tdLine.GetLineSegmentAt(i); //4.2 每段钢束线的长度 db.LineLengthDim(lineSeg, scale); //4.3 直线标注角度 if (tdLine.StartPoint.X < tdLine.EndPoint.X) { db.LineAngelDim(lineSeg, !(i == tdLine.NumberOfVertices - 2), scale); } else { db.LineAngelDim(lineSeg, (i == tdLine.NumberOfVertices - 2), scale); } } else if (tdLine.GetSegmentType(i) == SegmentType.Arc) { CircularArc3d arcSeg = tdLine.GetArcSegmentAt(i); //4.2 每段钢束线的长度 db.ArcLengthDim(arcSeg, scale); //4.3 圆弧标注半径 db.ArrowRadiusDim(arcSeg, scale); } //4.5 竖直距离标注 Ray vRay = new Ray();//建立竖直射线 vRay.BasePoint = tdLine.GetPoint3dAt(i); vRay.UnitDir = new Vector3d(0, 1, 0); Point3dCollection ptIntersects = new Point3dCollection(); tpLine.IntersectWith(vRay, Intersect.OnBothOperands, ptIntersects, IntPtr.Zero, IntPtr.Zero); Point3d ptIntersect = ptIntersects[0]; RotatedDimension dimV = new RotatedDimension(); dimV.XLine1Point = tdLine.GetPoint3dAt(i); //第一条尺寸边线 dimV.XLine2Point = ptIntersect; //第二条尺寸边线 dimV.DimLinePoint = tdLine.GetPoint3dAt(i); //尺寸线位置 dimV.Rotation = Math.PI / 2; //标注旋转90度 dimV.DimensionStyle = db.Dimstyle; //尺寸样式为当前样式 dimV.Dimscale = scale; //设置尺寸全局比例 dims.Add(dimV); } //4.1 节点间距点集缺钢束最后一个点、梁顶缘线端点 ptsH.Add(tdLine.EndPoint); ptsH.Add(tpLine.StartPoint); ptsH.Add(tpLine.EndPoint); db.ContinuedHorizontalDims(ptsH, pos, scale);//建立水平连续标注 //4.5 竖直距离标注缺最后一个点 Ray vRayLast = new Ray();//建立竖直射线 vRayLast.BasePoint = tdLine.GetPoint3dAt(tdLine.NumberOfVertices - 1); vRayLast.UnitDir = new Vector3d(0, 1, 0); Point3dCollection ptIntersectsLast = new Point3dCollection(); tpLine.IntersectWith(vRayLast, Intersect.OnBothOperands, ptIntersectsLast, IntPtr.Zero, IntPtr.Zero); Point3d ptIntersectLast = ptIntersectsLast[0]; RotatedDimension dimVLast = new RotatedDimension(); dimVLast.XLine1Point = tdLine.GetPoint3dAt(tdLine.NumberOfVertices - 1); //第一条尺寸边线 dimVLast.XLine2Point = ptIntersectLast; //第二条尺寸边线 dimVLast.DimLinePoint = tdLine.GetPoint3dAt(tdLine.NumberOfVertices - 1); //尺寸线位置 dimVLast.Rotation = Math.PI / 2; //标注旋转90度 dimVLast.DimensionStyle = db.Dimstyle; //尺寸样式为当前样式 dimVLast.Dimscale = scale; //设置尺寸全局比例 dims.Add(dimVLast); //4.6 绘制张拉端 //4.6.1 绘制两侧张拉段 //获取钢束线真实的起点和终点 Point3d tdStart = (tdLine.StartPoint.X < tdLine.EndPoint.X) ? tdLine.StartPoint : tdLine.EndPoint; Point3d tdEnd = (tdLine.StartPoint.X < tdLine.EndPoint.X) ? tdLine.EndPoint : tdLine.StartPoint; //获取钢束线真实的起终点角度 double iclStart = (tdLine.StartPoint.X < tdLine.EndPoint.X) ? GetAngleOfLineSeg(tdLine.GetLineSegmentAt(0)) : GetAngleOfLineSeg(tdLine.GetLineSegmentAt(tdLine.NumberOfVertices - 2)); double iclEnd = (tdLine.StartPoint.X < tdLine.EndPoint.X) ? GetAngleOfLineSeg(tdLine.GetLineSegmentAt(tdLine.NumberOfVertices - 2)) : GetAngleOfLineSeg(tdLine.GetLineSegmentAt(0)); //创建张拉端几何点 Point3d tdDrawL = GeTools.PolarPoint(tdStart, iclStart, -800); Point3d tdDrawR = GeTools.PolarPoint(tdEnd, iclEnd, 800); //创建张拉段 Line leftDraw = new Line(tdDrawL, tdStart); leftDraw.Layer = tdLine.Layer; //张拉段与钢束线应该在同一层 Line rightDraw = new Line(tdDrawR, tdEnd); rightDraw.Layer = tdLine.Layer; //张拉段与钢束线应该在同一层 //4.6.2 标注张拉段的长度 //左侧张拉段 MText lengthL = new MText(); //长度 lengthL.Contents = "工作长度800"; //文字高度 lengthL.TextHeight = 3 * scale; //样式为当前样式 lengthL.TextStyleId = db.Textstyle; //旋转角度同直线段倾角 lengthL.Rotation = iclStart; //对齐位置为右上 lengthL.Attachment = AttachmentPoint.TopRight; //位置为中点垂线以下0.5个单位 lengthL.Location = GeTools.PolarPoint(GeTools.MidPoint(leftDraw.StartPoint, leftDraw.EndPoint), iclStart - Math.PI / 2, 0.5 * scale); //右侧张拉段 MText lengthR = new MText(); //长度 lengthR.Contents = "工作长度800"; //文字高度 lengthR.TextHeight = 3 * scale; //样式为当前样式 lengthR.TextStyleId = db.Textstyle; //旋转角度同直线段倾角 lengthR.Rotation = iclEnd; //对齐位置为左上 lengthR.Attachment = AttachmentPoint.TopLeft; //位置为中点垂线以下0.5个单位 lengthR.Location = GeTools.PolarPoint(GeTools.MidPoint(rightDraw.StartPoint, rightDraw.EndPoint), iclEnd - Math.PI / 2, 0.5 * scale); //4.7 在截面顶缘标识“梁顶缘线” Point3d midPt = GeTools.MidPoint(tpLine.StartPoint, tpLine.EndPoint); //顶缘线起终点中点 Point3d midPtInTp = tpLine.GetClosestPointTo(midPt, Vector3d.YAxis, true); //顶缘线上靠近中点的点 MText tpAnno = new MText(); tpAnno.Contents = "梁顶缘线"; //文字高度 tpAnno.TextHeight = 3 * scale; //样式为当前样式 tpAnno.TextStyleId = db.Textstyle; //对齐位置为右上 tpAnno.Attachment = AttachmentPoint.BottomLeft; //位置为中点以上0.5个单位 tpAnno.Location = GeTools.PolarPoint(midPtInTp, Math.PI / 2, 0.5 * scale); db.AddToModelSpace(dims.ToArray()); //添加各类标注 db.AddToModelSpace(leftDraw, rightDraw, lengthL, lengthR); //添加张拉段线 db.AddToModelSpace(tpAnno); //添加梁顶缘线标识 trans.Commit(); } }
private void btn_ok_Click(object sender, EventArgs e) { DocumentLock doclock = null; var doc = acapi.DocumentManager.MdiActiveDocument; var ed = doc.Editor; try { double txtsize; double sumValue = 0; if (!double.TryParse(cb_txtSize.Text, out txtsize)) { return; } var unit = ComBox_Unit.Text.Trim(); if (string.IsNullOrEmpty(unit)) { return; } txtsize = txtsize / 10; // 隐藏窗口 Visible = false; // 锁定文档 doclock = doc.LockDocument(); // 获取0层ID ObjectId layerID; using (var tr = doc.Database.TransactionManager.StartTransaction()) { doc.Database.SetCurrentLayer("背景地图"); layerID = doc.Database.AddLayer("背景地图"); tr.Commit(); } var re = ed.GetPoint("select point:\n"); if (re.Status != PromptStatus.OK) { return; } ed.WriteMessageWithReturn(re.Value); var jig = new measurejig(); jig.prePosition = re.Value; jig.curPosition = re.Value; var res = ed.Drag(jig); int i = 1; var sumtext = new DBText(); while (res.Status == PromptStatus.OK) { // 添加连线 var line = new Line(jig.prePosition, jig.curPosition); line.ColorIndex = 3; using (var tr = doc.Database.TransactionManager.StartTransaction()) { measureIDs.Add(doc.Database.AddToModelSpace(line)); line.LayerId = layerID; line.Color = Autodesk.AutoCAD.Colors.Color.FromColor(ccolor); tr.Commit(); } if (i == 1) { // 总长度添加标注 sumtext.Position = jig.prePosition; //sumtext.Height = txtsize / 111319.49079327357264771338267056; sumtext.Height = txtsize / MapConfig.Instance.earthscale; sumtext.TextString = string.Format("{0}{1}", sumValue, unit); using (var tr = doc.Database.TransactionManager.StartTransaction()) { measureIDs.Add(doc.Database.AddToModelSpace(sumtext)); sumtext.Color = Autodesk.AutoCAD.Colors.Color.FromColor(ccolor); sumtext.LayerId = layerID; tr.Commit(); } i++; } // 计算距离 var dist = jig.GetDistance(jig.curPosition, jig.prePosition, ComBox_Unit.SelectedIndex + 1); if (jig.curPosition != jig.prePosition && dist > 0) { var dbtext = new DBText(); // 计算标注角度 var vec3d = jig.prePosition.GetVectorTo(jig.curPosition); var vec2d = new Vector2d(vec3d.X, vec3d.Y); var rolate = vec2d.Angle; var midPt = GeTools.MidPoint(jig.prePosition, jig.curPosition); // 添加距离标注 dbtext.Position = midPt; dbtext.Height = txtsize / 111319.49079327357264771338267056; dbtext.Rotation = rolate; dbtext.TextString = dist + unit; using (var tr = doc.Database.TransactionManager.StartTransaction()) { measureIDs.Add(doc.Database.AddToModelSpace(dbtext)); dbtext.Color = Autodesk.AutoCAD.Colors.Color.FromColor(ccolor); dbtext.LayerId = layerID; tr.Commit(); } // 统计总长度 DCadApi.isModifySymbol = true; using (var tr = doc.Database.TransactionManager.StartTransaction()) { var ent = tr.GetObject(sumtext.ObjectId, OpenMode.ForWrite) as DBText; sumValue += dist; //sumtext.UpgradeOpen(); if (ent != null) { ent.TextString = string.Format("{0}{1}", sumValue, unit); } tr.Commit(); } DCadApi.isModifySymbol = false; } jig.prePosition = jig.curPosition; res = ed.Drag(jig); } } catch (Exception ex) { ed.WriteMessage(ex + "\n"); } finally { Visible = true; doclock.Dispose(); DCadApi.isModifySymbol = false; } }
public void DimTest() { Database db = HostApplicationServices.WorkingDatabase; using (Transaction trans = db.TransactionManager.StartTransaction()) { // 创建要标注的图形 Line line1 = new Line(new Point3d(30, 20, 0), new Point3d(120, 20, 0)); Line line2 = new Line(new Point3d(120, 20, 0), new Point3d(120, 40, 0)); Line line3 = new Line(new Point3d(120, 40, 0), new Point3d(90, 80, 0)); Line line4 = new Line(new Point3d(90, 80, 0), new Point3d(30, 80, 0)); Arc arc = new Arc(new Point3d(30, 50, 0), 30, Math.PI / 2, Math.PI * 3 / 2); Circle cir1 = new Circle(new Point3d(30, 50, 0), Vector3d.ZAxis, 15); Circle cir2 = new Circle(new Point3d(70, 50, 0), Vector3d.ZAxis, 10); //将图形添加到模型空间中 db.AddToModelSpace(line1, line2, line3, line4, arc, cir1, cir2); //创建一个列表,用于存储标注对象 List <Dimension> dims = new List <Dimension>(); // 创建转角标注(水平) RotatedDimension dimRotated1 = new RotatedDimension { //指定第一条尺寸界线的附着位置 XLine1Point = line1.StartPoint, //指定第二条尺寸界线的附着位置 XLine2Point = line1.EndPoint, //指定尺寸线的位置 DimLinePoint = GeTools.MidPoint(line1.StartPoint, line1.EndPoint).PolarPoint(-Math.PI / 2, 10), DimensionText = "<>mm" //设置标注的文字为标注值+后缀mm }; dims.Add(dimRotated1); //将水平转角标注添加到列表中 //创建转角标注(垂直) RotatedDimension dimRotated2 = new RotatedDimension { Rotation = Math.PI / 2, //转角标注角度为90度,表示垂直方向 //指定两条尺寸界线的附着位置和尺寸线的位置 XLine1Point = line2.StartPoint, XLine2Point = line2.EndPoint, DimLinePoint = GeTools.MidPoint(line2.StartPoint, line2.EndPoint).PolarPoint(0, 10) }; dims.Add(dimRotated2);//将垂直转角标注添加到列表中 //创建转角标注(尺寸公差标注) RotatedDimension dimRotated3 = new RotatedDimension { //指定两条尺寸界线的附着位置和尺寸线的位置 XLine1Point = line4.StartPoint, XLine2Point = line4.EndPoint, DimLinePoint = GeTools.MidPoint(line4.StartPoint, line4.EndPoint).PolarPoint(Math.PI / 2, 10), //设置标注的文字为标注值+堆叠文字 DimensionText = TextTools.StackText("<>", "+0.026", "-0.025", StackType.Tolerance, 0.7) }; dims.Add(dimRotated3);//将尺寸公差标注添加到列表中 // 创建对齐标注 AlignedDimension dimAligned = new AlignedDimension { //指定两条尺寸界线的附着位置和尺寸线的位置 XLine1Point = line3.StartPoint, XLine2Point = line3.EndPoint, DimLinePoint = GeTools.MidPoint(line3.StartPoint, line3.EndPoint).PolarPoint(Math.PI / 2, 10), //设置标注的文字为标注值+公差符号 DimensionText = "<>" + TextSpecialSymbol.Tolerance + "0.2" }; dims.Add(dimAligned);//将对齐标注添加到列表中 // 创建半径标注 RadialDimension dimRadial = new RadialDimension { Center = cir1.Center, //圆或圆弧的圆心 //用于附着引线的圆或圆弧上的点 ChordPoint = cir1.Center.PolarPoint(GeTools.DegreeToRadian(30), 15), LeaderLength = 10 //引线长度 }; dims.Add(dimRadial); //将半径标注添加到列表中 // 创建直径标注 DiametricDimension dimDiametric = new DiametricDimension { //圆或圆弧上第一个直径点的坐标 ChordPoint = cir2.Center.PolarPoint(GeTools.DegreeToRadian(45), 10), //圆或圆弧上第二个直径点的坐标 FarChordPoint = cir2.Center.PolarPoint(GeTools.DegreeToRadian(-135), 10), LeaderLength = 0 //从 ChordPoint 到注解文字或折线处的长度 }; dims.Add(dimDiametric); //将直径标注添加到列表中 // 创建角度标注 Point3AngularDimension dimLineAngular = new Point3AngularDimension { //圆或圆弧的圆心、或两尺寸界线间的共有顶点的坐标 CenterPoint = line2.StartPoint, //指定两条尺寸界线的附着位置 XLine1Point = line1.StartPoint, XLine2Point = line2.EndPoint, //设置角度标志圆弧线上的点 ArcPoint = line2.StartPoint.PolarPoint(GeTools.DegreeToRadian(135), 10) }; dims.Add(dimLineAngular);//将角度标注添加到列表中 // 创建弧长标注,标注文字取为默认值 ArcDimension dimArc = new ArcDimension(arc.Center, arc.StartPoint, arc.EndPoint, arc.Center.PolarPoint(Math.PI, arc.Radius + 10), "<>", db.Dimstyle); dims.Add(dimArc);//将弧长标注添加到列表中 // 创建显示X轴值的坐标标注 OrdinateDimension dimX = new OrdinateDimension { UsingXAxis = true, //显示 X 轴值 DefiningPoint = cir2.Center, //标注点 //指定引线终点,即标注文字显示的位置 LeaderEndPoint = cir2.Center.PolarPoint(-Math.PI / 2, 20) }; dims.Add(dimX);//将坐标标注添加到列表中 // 创建显示Y轴值的坐标标注 OrdinateDimension dimY = new OrdinateDimension { UsingXAxis = false, //显示Y轴 DefiningPoint = cir2.Center, //标注点 //指定引线终点,即标注文字显示的位置 LeaderEndPoint = cir2.Center.PolarPoint(0, 20) }; dims.Add(dimY); //将坐标标注添加到列表中 foreach (Dimension dim in dims) //遍历标注列表 { dim.DimensionStyle = db.Dimstyle; //设置标注样式为当前样式 db.AddToModelSpace(dim); //将标注添加到模型空间中 } trans.Commit();//提交更改 } }
public void TendonAnnotation() { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; db.SyncDwgToTdGenParas();//设置默认总体参数,已有总体参数字典项则无动作 using (Transaction trans = db.TransactionManager.StartTransaction()) { #region 1.选择梁顶缘线 PromptEntityOptions tpLineOpt = new PromptEntityOptions("\n选择梁顶缘线"); tpLineOpt.SetRejectMessage("\n顶缘线应为直线、圆弧或多段线"); tpLineOpt.AddAllowedClass(typeof(Line), true); //可以选择直线 tpLineOpt.AddAllowedClass(typeof(Polyline), true); //可以选择多段线 tpLineOpt.AddAllowedClass(typeof(Arc), true); //可以选择圆弧线 PromptEntityResult tpLineRes = ed.GetEntity(tpLineOpt); if (tpLineRes.Status != PromptStatus.OK) { return; } ObjectId tpLineId = tpLineRes.ObjectId; Curve tpLine = trans.GetObject(tpLineId, OpenMode.ForRead) as Curve; #endregion #region 2.选择钢束线 PromptEntityOptions tdLineOpt = new PromptEntityOptions("\n选择钢束"); tdLineOpt.SetRejectMessage("\n钢束应为多段线"); tdLineOpt.AddAllowedClass(typeof(Polyline), true);//仅能选择多段线 PromptEntityResult tdLineRes = ed.GetEntity(tdLineOpt); if (tdLineRes.Status != PromptStatus.OK) { return; } ObjectId tdLineId = tdLineRes.ObjectId; Polyline tdLine = trans.GetObject(tdLineId, OpenMode.ForRead) as Polyline; //判断钢束线是否在顶缘线以内,否则报错返回 if (tdLine.StartPoint.X < tpLine.StartPoint.X || tdLine.EndPoint.X > tpLine.EndPoint.X) { Application.ShowAlertDialog("钢束线超出顶缘线,请检查!"); return; } tdLine.SetDefaultTendonParams();//设置钢束默认参数,如已有Xrecord信息则无动作 #endregion #region 3.设置绘图参数(包括张拉方式和工作长度设置) //3.1 尺寸标注绘图位置及张拉方式和工作长度设置 Point3d pos = new Point3d();//初始化标注点 PromptPointOptions posOpt = new PromptPointOptions("\n设置标注线位置或设置[张拉方式(D)/工作长度(W)]"); posOpt.Keywords.Add("D"); posOpt.Keywords.Add("W"); posOpt.AppendKeywordsToMessage = false; //提示信息中不显示关键字 //获取钢束张拉方式 int tdDrawStyle = 0; //默认为两端张拉 if (!tdLine.ExtensionDictionary.IsNull && tdLine.ObjectId.GetXrecord("DA_Tendons") != null) //如果钢束线有扩展记录则取扩展记录数据 { tdDrawStyle = (Int16)tdLine.ObjectId.GetXrecord("DA_Tendons")[4].Value; } //获取工作长度信息 double workLen = 800; DBDictionary dicts = db.NamedObjectsDictionaryId.GetObject(OpenMode.ForWrite) as DBDictionary; if (dicts.Contains("DA_Tendons"))//如果字典中含DA_Tendons的字典项 { ObjectId tdsDictId = dicts.GetAt("DA_Tendons"); DBDictionary tdsDict = tdsDictId.GetObject(OpenMode.ForRead) as DBDictionary; //获取DA_Tendons字典 ObjectId xrecId = tdsDict.GetAt("workLen"); //获取字典中的工作长度项 Xrecord xrec = xrecId.GetObject(OpenMode.ForRead) as Xrecord; //获取工作长度项中的Xrecird TypedValueList vls = xrec.Data; //获取Xrecord中的TypedValueList数据 workLen = (double)vls[0].Value; //根据TypedValueList数据中的数值更新工作长度workLen } for (;;) { PromptPointResult posRes = ed.GetPoint(posOpt); if (posRes.Status == PromptStatus.Keyword) { switch (posRes.StringResult) { case "D": //选择修改张拉方式 PromptIntegerOptions drwOpt = new PromptIntegerOptions($"\n输入张拉方式[两端张拉(0)/左端张拉[-1]/右端张拉[1]<{tdDrawStyle}>"); drwOpt.AllowNone = true; //允许ESC退出 PromptIntegerResult drwRes = ed.GetInteger(drwOpt); if (drwRes.Value == 0) { tdDrawStyle = 0; } else if (drwRes.Value == -1) { tdDrawStyle = -1; } else if (drwRes.Value == 1) { tdDrawStyle = 1; } TypedValueList values = tdLine.ObjectId.GetXrecord("DA_Tendons"); //根据输入更新钢束线的Xrecord记录 values.RemoveAt(4); values.Add(DxfCode.Int16, tdDrawStyle); break; case "W": //修改工作长度 PromptDoubleOptions wklOpt = new PromptDoubleOptions($"\n输入工作长度<{workLen.ToString("F0")}>"); wklOpt.AllowNone = true; //允许ESC退出 PromptDoubleResult wklRes = ed.GetDouble(wklOpt); if (wklRes.Status == PromptStatus.OK) { workLen = wklRes.Value; ObjectId tdsDictId = dicts.GetAt("DA_Tendons");//更新DA_Tendons字典中的钢束总体参数 DBDictionary tdsDict = tdsDictId.GetObject(OpenMode.ForRead) as DBDictionary; ObjectId xrecId = tdsDict.GetAt("workLen"); Xrecord xrec = xrecId.GetObject(OpenMode.ForWrite) as Xrecord; TypedValueList vls = new TypedValueList(); vls.Add(DxfCode.Real, workLen); xrec.Data = vls; xrec.DowngradeOpen(); } break; } } else if (posRes.Status == PromptStatus.OK) { pos = posRes.Value; break; } } //3.2 绘图比例 PromptDoubleOptions scaleOpt = new PromptDoubleOptions($"\n设置绘图比例<{scale}>"); scaleOpt.AllowNone = true; //允许回车,则采用前次比例 scaleOpt.AllowNegative = false; //不允许负值 scaleOpt.AllowZero = false; //不允许零值 PromptDoubleResult scaleRes = ed.GetDouble(scaleOpt); //获取比例 if (scaleRes.Status != PromptStatus.OK && scaleRes.Status != PromptStatus.None) { return; } else if (scaleRes.Status == PromptStatus.OK) { scale = scaleRes.Value; } #endregion #region 4.建立各类标注 List <Point3d> ptsH = new List <Point3d>(); //创建水平标注点集 List <Dimension> dims = new List <Dimension>(); //创建标注集,存放各类标注 for (int i = 0; i < tdLine.NumberOfVertices - 1; i++) { //4.1 水平点集 ptsH.Add(tdLine.GetPoint3dAt(i)); //4.2 每段钢束线的长度 //4.3 直线标注角度 //4.4 圆弧线标注半径 if (tdLine.GetSegmentType(i) == SegmentType.Line) { LineSegment3d lineSeg = tdLine.GetLineSegmentAt(i); //4.2 每段钢束线的长度 db.LineLengthDim(lineSeg, scale); //4.3 直线标注角度 if (tdLine.StartPoint.X < tdLine.EndPoint.X) { db.LineAngelDim(lineSeg, !(i == tdLine.NumberOfVertices - 2), scale); } else { db.LineAngelDim(lineSeg, (i == tdLine.NumberOfVertices - 2), scale); } } else if (tdLine.GetSegmentType(i) == SegmentType.Arc) { CircularArc3d arcSeg = tdLine.GetArcSegmentAt(i); //4.2 每段钢束线的长度 db.ArcLengthDim(arcSeg, scale); //4.3 圆弧标注半径 db.ArrowRadiusDim(arcSeg, scale); } //4.5 竖直距离标注 Ray vRay = new Ray();//建立竖直射线 vRay.BasePoint = tdLine.GetPoint3dAt(i); vRay.UnitDir = new Vector3d(0, 1, 0); Point3dCollection ptIntersects = new Point3dCollection(); tpLine.IntersectWith(vRay, Intersect.OnBothOperands, ptIntersects, IntPtr.Zero, IntPtr.Zero); Point3d ptIntersect = ptIntersects[0]; RotatedDimension dimV = new RotatedDimension(); dimV.XLine1Point = tdLine.GetPoint3dAt(i); //第一条尺寸边线 dimV.XLine2Point = ptIntersect; //第二条尺寸边线 dimV.DimLinePoint = tdLine.GetPoint3dAt(i); //尺寸线位置 dimV.Rotation = Math.PI / 2; //标注旋转90度 dimV.DimensionStyle = db.Dimstyle; //尺寸样式为当前样式 dimV.Dimscale = scale; //设置尺寸全局比例 dims.Add(dimV); } //4.1 节点间距点集缺钢束最后一个点、梁顶缘线端点 ptsH.Add(tdLine.EndPoint); ptsH.Add(tpLine.StartPoint); ptsH.Add(tpLine.EndPoint); db.ContinuedHorizontalDims(ptsH, pos, scale);//建立水平连续标注 //4.5 竖直距离标注缺最后一个点 Ray vRayLast = new Ray();//建立竖直射线 vRayLast.BasePoint = tdLine.GetPoint3dAt(tdLine.NumberOfVertices - 1); vRayLast.UnitDir = new Vector3d(0, 1, 0); Point3dCollection ptIntersectsLast = new Point3dCollection(); tpLine.IntersectWith(vRayLast, Intersect.OnBothOperands, ptIntersectsLast, IntPtr.Zero, IntPtr.Zero); Point3d ptIntersectLast = ptIntersectsLast[0]; RotatedDimension dimVLast = new RotatedDimension(); dimVLast.XLine1Point = tdLine.GetPoint3dAt(tdLine.NumberOfVertices - 1); //第一条尺寸边线 dimVLast.XLine2Point = ptIntersectLast; //第二条尺寸边线 dimVLast.DimLinePoint = tdLine.GetPoint3dAt(tdLine.NumberOfVertices - 1); //尺寸线位置 dimVLast.Rotation = Math.PI / 2; //标注旋转90度 dimVLast.DimensionStyle = db.Dimstyle; //尺寸样式为当前样式 dimVLast.Dimscale = scale; //设置尺寸全局比例 dims.Add(dimVLast); #endregion #region 5 绘制张拉端 //5.1 获取张拉端几何特征 //获取钢束线真实的起点和终点 Point3d tdStart = (tdLine.StartPoint.X < tdLine.EndPoint.X) ? tdLine.StartPoint : tdLine.EndPoint; Point3d tdEnd = (tdLine.StartPoint.X < tdLine.EndPoint.X) ? tdLine.EndPoint : tdLine.StartPoint; //获取钢束线真实的起终点角度 double iclStart = (tdLine.StartPoint.X < tdLine.EndPoint.X) ? tdLine.GetLineSegmentAt(0).GetAngleOfLineSeg() : tdLine.GetLineSegmentAt(tdLine.NumberOfVertices - 2).GetAngleOfLineSeg(); double iclEnd = (tdLine.StartPoint.X < tdLine.EndPoint.X) ? tdLine.GetLineSegmentAt(tdLine.NumberOfVertices - 2).GetAngleOfLineSeg() : tdLine.GetLineSegmentAt(0).GetAngleOfLineSeg(); //初始化张拉端图元 Polyline leftDraw = new Polyline(); Polyline rightDraw = new Polyline(); MText lengthL = new MText(); MText lengthR = new MText(); //5.2 左侧张拉端 //5.2.1 两侧张拉或左侧张拉时左端绘制工作长度线 if (tdDrawStyle == 0 || tdDrawStyle == -1) { //创建张拉端几何点 Point3d tdDrawL = GeTools.PolarPoint(tdStart, iclStart, -workLen); //创建张拉段 leftDraw = new Polyline(); leftDraw.AddVertexAt(0, tdStart.ToPoint2d(), 0, 0, 0); leftDraw.AddVertexAt(1, tdDrawL.ToPoint2d(), 0, 0, 0); leftDraw.Layer = tdLine.Layer;//张拉段与钢束线应该在同一层 //标注左侧张拉段 lengthL = new MText(); //长度 lengthL.Contents = "工作长度" + workLen.ToString("F0"); //文字高度 lengthL.TextHeight = 3 * scale; //样式为当前样式 lengthL.TextStyleId = db.Textstyle; //旋转角度同直线段倾角 lengthL.Rotation = iclStart; //对齐位置为右上 lengthL.Attachment = AttachmentPoint.TopRight; //位置为中点垂线以下0.5个单位 lengthL.Location = GeTools.PolarPoint(GeTools.MidPoint(leftDraw.StartPoint, leftDraw.EndPoint), iclStart - Math.PI / 2, 0.5 * scale); } //5.2.2 右侧张拉时绘制P锚标识 else { //创建P锚起终点 Point3d tdDrawL1 = GeTools.PolarPoint(tdStart, iclStart + Math.PI / 2, 0.75 * scale); Point3d tdDrawL2 = GeTools.PolarPoint(tdStart, iclStart + Math.PI / 2, -0.75 * scale); //创建P锚标志 leftDraw = new Polyline(); leftDraw.AddVertexAt(0, tdDrawL1.ToPoint2d(), 0, 0.35 * scale, 0.35 * scale); leftDraw.AddVertexAt(1, tdDrawL2.ToPoint2d(), 0, 0.35 * scale, 0.35 * scale); leftDraw.Layer = tdLine.Layer;//张拉段与钢束线应该在同一层 //标注左侧P锚 lengthL = new MText(); //长度 lengthL.Contents = "P锚"; //文字高度 lengthL.TextHeight = 3 * scale; //样式为当前样式 lengthL.TextStyleId = db.Textstyle; //旋转角度同直线段倾角 lengthL.Rotation = iclStart; //对齐位置为右中 lengthL.Attachment = AttachmentPoint.MiddleRight; //位置为P锚标志右侧0.5个单位 lengthL.Location = GeTools.PolarPoint(GeTools.MidPoint(leftDraw.StartPoint, leftDraw.EndPoint), iclStart, -2 * scale); } //5.3 右侧张拉端绘制 //5.3.1 两侧张拉或右侧张拉时右端绘制工作长度线 if (tdDrawStyle == 0 || tdDrawStyle == 1) { //创建张拉端几何点 Point3d tdDrawR = GeTools.PolarPoint(tdEnd, iclEnd, workLen); //创建张拉段 rightDraw = new Polyline(); rightDraw.AddVertexAt(0, tdEnd.ToPoint2d(), 0, 0, 0); rightDraw.AddVertexAt(1, tdDrawR.ToPoint2d(), 0, 0, 0); rightDraw.Layer = tdLine.Layer;//张拉段与钢束线应该在同一层 //标注右侧张拉段 lengthR = new MText(); //长度 lengthR.Contents = "工作长度" + workLen.ToString("F0"); //文字高度 lengthR.TextHeight = 3 * scale; //样式为当前样式 lengthR.TextStyleId = db.Textstyle; //旋转角度同直线段倾角 lengthR.Rotation = iclEnd; //对齐位置为左上 lengthR.Attachment = AttachmentPoint.TopLeft; //位置为中点垂线以下0.5个单位 lengthR.Location = GeTools.PolarPoint(GeTools.MidPoint(rightDraw.StartPoint, rightDraw.EndPoint), iclEnd - Math.PI / 2, 0.5 * scale); } //5.2.2 左侧张拉时绘制P锚标识 else//绘制P锚 { //创建P锚起终点 Point3d tdDrawR1 = GeTools.PolarPoint(tdEnd, iclEnd + Math.PI / 2, 0.75 * scale); Point3d tdDrawR2 = GeTools.PolarPoint(tdEnd, iclEnd + Math.PI / 2, -0.75 * scale); //创建P锚标志 rightDraw = new Polyline(); rightDraw.AddVertexAt(0, tdDrawR1.ToPoint2d(), 0, 0.35 * scale, 0.35 * scale); rightDraw.AddVertexAt(1, tdDrawR2.ToPoint2d(), 0, 0.35 * scale, 0.35 * scale); rightDraw.Layer = tdLine.Layer;//张拉段与钢束线应该在同一层 //标注左侧P锚 lengthR = new MText(); //长度 lengthR.Contents = "P锚"; //文字高度 lengthR.TextHeight = 3 * scale; //样式为当前样式 lengthR.TextStyleId = db.Textstyle; //旋转角度同直线段倾角 lengthR.Rotation = iclEnd; //对齐位置为左中 lengthR.Attachment = AttachmentPoint.MiddleLeft; //位置为P锚标志右侧0.5个单位 lengthR.Location = GeTools.PolarPoint(GeTools.MidPoint(rightDraw.StartPoint, rightDraw.EndPoint), iclEnd, 2 * scale); } #endregion #region 6 在截面顶缘标识“梁顶缘线” Point3d midPt = GeTools.MidPoint(tpLine.StartPoint, tpLine.EndPoint); //顶缘线起终点中点 Point3d midPtInTp = tpLine.GetClosestPointTo(midPt, Vector3d.YAxis, true); //顶缘线上靠近中点的点 MText tpAnno = new MText(); tpAnno.Contents = "梁顶缘线"; //文字高度 tpAnno.TextHeight = 3 * scale; //样式为当前样式 tpAnno.TextStyleId = db.Textstyle; //对齐位置为右上 tpAnno.Attachment = AttachmentPoint.BottomLeft; //位置为中点以上0.5个单位 tpAnno.Location = GeTools.PolarPoint(midPtInTp, Math.PI / 2, 0.5 * scale); #endregion db.AddToModelSpace(dims.ToArray()); //添加各类标注 db.AddToModelSpace(leftDraw, rightDraw, lengthL, lengthR); //添加张拉段线 db.AddToModelSpace(tpAnno); //添加梁顶缘线标识 trans.Commit(); } }
protected override SamplerStatus Sampler(JigPrompts prompts) { Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; Matrix3d mt = ed.CurrentUserCoordinateSystem; JigPromptPointOptions optJigPoint = new JigPromptPointOptions("\n请指定矩形的另一角点") { Cursor = CursorType.Crosshair, UserInputControls = UserInputControls.Accept3dCoordinates | UserInputControls.NoZeroResponseAccepted | UserInputControls.NoNegativeResponseAccepted, BasePoint = m_Pt1.TransformBy(mt), UseBasePoint = true }; PromptPointResult resJigPoint = prompts.AcquirePoint(optJigPoint); Point3d tempPt = resJigPoint.Value; if (resJigPoint.Status == PromptStatus.Cancel) { return(SamplerStatus.Cancel); } if (m_Pt2 != tempPt) { m_Pt2 = tempPt; Point3d ucsPt2 = m_Pt2.TransformBy(mt.Inverse()); m_Polyline.Normal = Vector3d.ZAxis; m_Polyline.Elevation = 0.0; m_Polyline.SetPointAt(0, new Point2d(m_Pt1.X, m_Pt1.Y)); m_Polyline.SetPointAt(1, new Point2d(ucsPt2.X, m_Pt1.Y)); m_Polyline.SetPointAt(2, new Point2d(ucsPt2.X, ucsPt2.Y)); m_Polyline.SetPointAt(3, new Point2d(m_Pt1.X, ucsPt2.Y)); m_Polyline.TransformBy(mt); Point3d cenPt = GeTools.MidPoint(m_Pt1.TransformBy(mt), m_Pt2); Point3d majorPt = new Point3d(ucsPt2.X, m_Pt1.Y, 0); Vector3d vecX = GeTools.MidPoint(majorPt, ucsPt2).TransformBy(mt) - cenPt; try { if (Math.Abs(ucsPt2.X - m_Pt1.X) < 0.0000001 | Math.Abs(ucsPt2.Y - m_Pt1.Y) < 0.000001) { m_Ellipse = new Ellipse(Point3d.Origin, Vector3d.ZAxis, new Vector3d(0.00000001, 0, 0), 1.0, 0.0, 0.0); } else { double radiusRatio = Math.Abs((ucsPt2.X - m_Pt1.X) / (ucsPt2.Y - m_Pt1.Y)); if (radiusRatio < 1.0) { majorPt = new Point3d(m_Pt1.X, ucsPt2.Y, 0.0); vecX = GeTools.MidPoint(majorPt, ucsPt2).TransformBy(mt) - cenPt; } else { radiusRatio = 1.0 / radiusRatio; } m_Ellipse.Set(cenPt, mt.CoordinateSystem3d.Zaxis, vecX, radiusRatio, 0, 2 * Math.PI); } } catch { } return(SamplerStatus.OK); } else { return(SamplerStatus.NoChange); } }
/// <summary> /// 自动编号 /// </summary> /// <param name="insertPoint">插入点</param> public static void CreateItemNo(Point3d insertPoint, EntityList list, string prefix, int number) { // Put your command code here Plane plane = new Plane(); Ellipse ellipse = new Ellipse(insertPoint, plane.Normal, new Vector3d(200, 0, 0), 0.54, 0, GeTools.DegreeToRadian(360)); DBText text = new DBText(); text.Height = 120; //单行文字的插入点有两个,不同的对齐方式,需要设置的点不同 text.HorizontalMode = TextHorizontalMode.TextCenter; text.VerticalMode = TextVerticalMode.TextVerticalMid; text.Position = insertPoint; text.AlignmentPoint = insertPoint; if (number < 10) { text.TextString = prefix + "0" + number.ToString(); } else { text.TextString = prefix + number.ToString(); } list.Add(ellipse); list.Add(text); }
static void Init() { window = (GeTools)EditorWindow.GetWindow <GeTools> ("常用文本功能"); }
static void Init () { window = (GeTools)EditorWindow.GetWindow <GeTools> ("常用文本功能"); }