CAD.net二次开发--自动调成图框位置
[CommandMethod("mm")] public void mm() { Database db = HostApplicationServices.WorkingDatabase; Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; TypedValue[] values = new TypedValue[] { new TypedValue((int)DxfCode.LayerName,"TK") }; SelectionFilter selfilter = new SelectionFilter(values); PromptSelectionResult psr = ed.SelectAll(selfilter); if (psr.Status == PromptStatus.OK) { ed.WriteMessage(psr.Value.Count.ToString()); } else return; SelectionSet ss = psr.Value; List<Polyline> pls=new List<Polyline>(); Point2dCollection points = new Point2dCollection(); Polyline mypl = new Polyline(); using (Transaction trans = db.TransactionManager.StartTransaction()) { foreach (ObjectId id in ss.GetObjectIds()) { Polyline ent = trans.GetObject(id, OpenMode.ForWrite) as Polyline; if(ent!=null) { if (!ent.Closed) ent.Closed=true; mypl = ent; for (int i = 0; i < ent.NumberOfVertices; i++) { points.Add(ent.GetPoint2dAt(i)); } } } trans.Commit(); } double xmin = points[0].X; double xmax = points[0].X; double ymin = points[0].Y; double ymax = points[0].Y; double basex = 0; double basex1 = 0; double basey = 0; double basey1 = 0; ed.WriteMessage(mypl.NumberOfVertices.ToString()); for (int i = 0; i < mypl.NumberOfVertices; i++) { ed.WriteMessage(points[i].ToString()); } for (int i = 1; i < mypl.NumberOfVertices; i++) { if (xmin > points[i].X) xmin = points[i].X; if (xmax < points[i].X) xmax = points[i].X; if (ymin > points[i].Y) ymin = points[i].Y; if (ymax < points[i].Y) ymax = points[i].Y; } ed.WriteMessage("\n" + xmin.ToString() + "\n" + ymin.ToString() + "\n" ); basex = xmin + 6.0; basey = ymin + 6.0; basex1 = ((int)(basex * 0.1 + 0.5))*10; basey1 = ((int)(basey * 0.1 + 0.5))*10; ed.WriteMessage("\n改后:"+basex1.ToString()); ed.WriteMessage("\n改后:" + basey1.ToString()); Vector3d vec = new Vector3d(basex1 - basex, basey1 - basey,0); //////////////////////////////////////////////////// Point3d[] p = new Point3d[4]; p[0] = new Point3d(xmin + 6.0, ymin + 6.0, 0); p[1] = new Point3d(xmax - 6.0, ymin + 6.0, 0); double basex2 = ((int)(p[1].X * 0.1 + 0.5)) * 10; double basey2 = ((int)(p[1].Y * 0.1 + 0.5)) * 10; p[2] = new Point3d(xmax - 6.0, ymax - 6.0, 0); double basex3 = ((int)(p[2].X * 0.1 + 0.5)) * 10; double basey3 = ((int)(p[2].Y * 0.1 + 0.5)) * 10; p[3] = new Point3d(xmin + 6.0, ymax - 6.0, 0); double basex4 = ((int)(p[3].X * 0.1 + 0.5)) * 10; double basey4 = ((int)(p[3].Y * 0.1 + 0.5)) * 10; ObjectId[] text1id = Class2.fun(p[0]); //ed.WriteMessage("字符串长度:"+str.Length.ToString()); using (Transaction tr = db.TransactionManager.StartTransaction()) { DBText thistext1 = tr.GetObject(text1id[0], OpenMode.ForWrite) as DBText; thistext1.TextString = basey1.ToString(); DBText thistext2 = tr.GetObject(text1id[1], OpenMode.ForWrite) as DBText; thistext2.TextString = basex1.ToString(); tr.Commit(); } ObjectId[] text2id = Class2.fun(p[1]); //ed.WriteMessage("字符串长度:"+str.Length.ToString()); using (Transaction tr = db.TransactionManager.StartTransaction()) { DBText thistext1 = tr.GetObject(text2id[0], OpenMode.ForWrite) as DBText; thistext1.TextString = basey2.ToString(); DBText thistext2 = tr.GetObject(text2id[1], OpenMode.ForWrite) as DBText; thistext2.TextString = basex2.ToString(); tr.Commit(); } ObjectId[] text3id = Class2.fun(p[2]); //ed.WriteMessage("字符串长度:"+str.Length.ToString()); using (Transaction tr = db.TransactionManager.StartTransaction()) { DBText thistext1 = tr.GetObject(text3id[0], OpenMode.ForWrite) as DBText; thistext1.TextString = basey3.ToString(); DBText thistext2 = tr.GetObject(text3id[1], OpenMode.ForWrite) as DBText; thistext2.TextString = basex3.ToString(); tr.Commit(); } ObjectId[] text4id = Class2.fun(p[3]); //ed.WriteMessage("字符串长度:"+str.Length.ToString()); using (Transaction tr = db.TransactionManager.StartTransaction()) { DBText thistext1 = tr.GetObject(text4id[0], OpenMode.ForWrite) as DBText; thistext1.TextString = basex4.ToString(); DBText thistext2 = tr.GetObject(text4id[1], OpenMode.ForWrite) as DBText; thistext2.TextString = basey4.ToString(); tr.Commit(); } /////////////////////////修改图框表头下面的代号//////////////////////// Point3d pointmid = new Point3d((xmin+xmax)*0.5,ymax,0); ObjectId[] idmid = Class2.fun(pointmid); using (Transaction tr = db.TransactionManager.StartTransaction()) { DBText textmid = tr.GetObject(idmid[0], OpenMode.ForWrite) as DBText; string strtemp = basey1.ToString() + basex1.ToString(); strtemp = strtemp.Insert(3, "."); strtemp = strtemp.Insert(7, "-"); strtemp = strtemp.Insert(11, "."); textmid.TextString = strtemp; tr.Commit(); } /////////////////////////////////////////////////// using (Transaction tran1 = db.TransactionManager.StartTransaction()) { Matrix3d mt = Matrix3d.Displacement(vec); foreach (ObjectId id in ss.GetObjectIds()) { Entity ent = tran1.GetObject(id, OpenMode.ForWrite) as Entity; if (ent != null) { ent.TransformBy(mt); } } tran1.Commit(); } }
1、选择整个图框,找到图框线4个节点坐标,并排序
2、将图框放在特定位置,并修改新位置坐标,程序的fun(point3d p)函数在令一篇日志。
本文主要供新手学习。