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)函数在令一篇日志。

本文主要供新手学习。

 

posted @ 2016-07-24 16:34  wanglumi  阅读(1559)  评论(1编辑  收藏  举报