Example #1
0
        public void MyCommand() // This method can have any name
        {
            // Put your command code here
            Document doc           = Application.DocumentManager.MdiActiveDocument;
            Database db            = doc.Database;
            Editor   ed            = doc.Editor;
            string   ClipLayerName = "TK-视口";

            using (Transaction Trans = db.TransactionManager.StartTransaction())
            {
                try
                {
                    //获取布局列表(剔除模型空间)
                    DBDictionary Layouts    = Trans.GetObject(db.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary;
                    ArrayList    Layoutlist = new ArrayList();
                    foreach (DBDictionaryEntry item in Layouts)
                    {
                        if (item.Key != "Model")
                        {
                            Layout layoutobject = Trans.GetObject(item.Value, OpenMode.ForRead) as Layout;
                            Layoutlist.Add(layoutobject);
                        }
                    }
                    //获取view列表,注意哦,是symbotable,不能用viewtable,会闪退
                    SymbolTable MyVt     = Trans.GetObject(db.ViewTableId, OpenMode.ForRead) as SymbolTable;
                    ArrayList   viewlist = new ArrayList();
                    foreach (ObjectId viewID in MyVt)
                    {
                        ViewTableRecord VR = Trans.GetObject(viewID, OpenMode.ForRead) as ViewTableRecord;
                        viewlist.Add(VR);
                        //ed.WriteMessage("\nhehe:{0}", viewID.ToString());
                    }

                    LayerStateManager layerState = db.LayerStateManager;


                    /*
                     * foreach(ViewTableRecord VR in viewlist)
                     * {
                     *
                     *  ed.WriteMessage("\n视图名:{0}", VR.Name);
                     *  ed.WriteMessage("\n视图中心坐标:{0}", VR.CenterPoint);
                     *  ed.WriteMessage("\n视图高度:{0}", VR.Height);
                     *  ed.WriteMessage("\n视图target:{0}", VR.Target);
                     *  ed.WriteMessage("\n视图宽度:{0}", VR.Width);
                     *  ed.WriteMessage("\n视图角度:{0}", VR.ViewTwist);
                     *
                     *  ed.WriteMessage("\n图层状况{0}", VR.LayerState);
                     * }
                     */

                    int scale = 1;
                    PromptIntegerOptions GetNumberOption = new PromptIntegerOptions("\n输入视口比例,默认为1");
                    GetNumberOption.AllowNegative = false;
                    GetNumberOption.AllowZero     = false;
                    GetNumberOption.AllowNone     = true;
                    PromptIntegerResult GetNumberResult = ed.GetInteger(GetNumberOption);
                    if (GetNumberResult.Status == PromptStatus.OK)
                    {
                        scale = GetNumberResult.Value;
                    }

                    for (int i = 0; i < Layoutlist.Count; i++)
                    {
                        if (i == viewlist.Count)
                        {
                            continue;
                        }
                        ViewTableRecord VR = viewlist[i] as ViewTableRecord;
                        Viewport        VP = SetViewport(VR, new Point2d(0, 0), scale);

                        Layout           LT  = Layoutlist[i] as Layout;
                        BlockTableRecord BTR = Trans.GetObject(LT.BlockTableRecordId, OpenMode.ForWrite) as BlockTableRecord;
                        BTR.AppendEntity(VP);
                        Trans.AddNewlyCreatedDBObject(VP, true);

                        LayoutManager.Current.SetCurrentLayoutId(LT.Id);
                        VP.On = true;

                        //恢复视图的图层状态
                        layerState.RestoreLayerState(VR.LayerState, VP.Id, 1, LayerStateMasks.CurrentViewport);

                        TypedValue[] Filter = new TypedValue[]
                        {
                            new TypedValue((int)DxfCode.Operator, "<and"),
                            new TypedValue((int)DxfCode.LayoutName, LT.LayoutName),
                            new TypedValue((int)DxfCode.LayerName, ClipLayerName),
                            new TypedValue((int)DxfCode.Operator, "<or"),
                            new TypedValue((int)DxfCode.Start, "POLYLINE"),
                            new TypedValue((int)DxfCode.Start, "POLYLINE3D"),
                            new TypedValue((int)DxfCode.Start, "POLYLINE2D"),
                            new TypedValue((int)DxfCode.Start, "LWPOLYLINE"),
                            new TypedValue((int)DxfCode.Operator, "or>"),
                            new TypedValue((int)DxfCode.Operator, "and>")
                        };
                        PromptSelectionResult selresult = ed.SelectAll(new SelectionFilter(Filter));
                        if (selresult.Status == PromptStatus.OK)
                        {
                            ObjectId[] IDs = selresult.Value.GetObjectIds();
                            VP.NonRectClipEntityId = IDs[0];
                            VP.NonRectClipOn       = true;
                            //ed.WriteMessage("\n呵呵,剪裁了视口哦");
                        }
                        else
                        {
                            ed.WriteMessage("\n布局“{0}”中未找到裁剪视口的多义线!视口裁剪失败!", LT.LayoutName);
                        }
                    }

                    Trans.Commit();
                }
                catch (Autodesk.AutoCAD.Runtime.Exception Ex)
                {
                    ed.WriteMessage("出错啦!{0}", Ex.ToString());
                }
                finally
                {
                    Trans.Dispose();
                }
            }
        }
Example #2
0
        public void MyCommand() // This method can have any name
        {
            // Put your command code here
            Document          doc           = Application.DocumentManager.MdiActiveDocument;
            Database          db            = doc.Database;
            Editor            ed            = doc.Editor;
            LayerStateManager layerState    = db.LayerStateManager;
            string            ClipLayerName = "TK-视口";

            using (Transaction Trans = db.TransactionManager.StartTransaction())
            {
                try
                {
                    //获取布局列表(剔除模型空间)
                    DBDictionary Layouts    = Trans.GetObject(db.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary;
                    ArrayList    Layoutlist = new ArrayList();
                    foreach (DBDictionaryEntry item in Layouts)
                    {
                        if (item.Key != "Model")
                        {
                            Layout layoutobject = Trans.GetObject(item.Value, OpenMode.ForRead) as Layout;
                            Layoutlist.Add(layoutobject);
                        }
                    }
                    //获取view列表,注意哦,是symbotable,不能用viewtable,会闪退
                    SymbolTable MyVt     = Trans.GetObject(db.ViewTableId, OpenMode.ForRead) as SymbolTable;
                    ArrayList   viewlist = new ArrayList();
                    foreach (ObjectId viewID in MyVt)
                    {
                        ViewTableRecord VR = Trans.GetObject(viewID, OpenMode.ForRead) as ViewTableRecord;
                        viewlist.Add(VR);
                    }
                    if (viewlist.Count == 0)
                    {
                        ed.WriteMessage("\n未发现存储的视图!");
                        return;
                    }

                    double scale = 1;
                    PromptDoubleOptions GetNumberOption = new PromptDoubleOptions("\n输入视口比例,默认为1");
                    GetNumberOption.AllowNegative = false;
                    GetNumberOption.AllowZero     = false;
                    GetNumberOption.AllowNone     = true;
                    PromptDoubleResult GetNumberResult = ed.GetDouble(GetNumberOption);
                    if (GetNumberResult.Status == PromptStatus.OK)
                    {
                        scale = GetNumberResult.Value;
                    }
                    else
                    {
                        return;
                    }

                    for (int i = 0; i < Layoutlist.Count; i++)
                    {
                        if (i == viewlist.Count)
                        {
                            break;
                        }
                        Layout   LT      = Layoutlist[i] as Layout;
                        string[] split   = LT.LayoutName.Split(' ');
                        Regex    patten  = new Regex(@"^0*\d{1,}");
                        Regex    replace = new Regex("^0*");
                        string   match   = replace.Replace(split[0], "");
                        var      query   = from ViewTableRecord view in viewlist
                                           where replace.Replace(view.Name, "") == match
                                           select view;
                        if (!query.Any())
                        {
                            ed.WriteMessage("\n布局“{0}”未找到匹配的视图,没有成功生成视口!", LT.LayoutName);
                            i--;
                            continue;
                        }

                        ViewTableRecord VR = query.First();
                        Viewport        VP = GetViewport(VR, new Point2d(0, 0), scale, false);

                        BlockTableRecord BTR = Trans.GetObject(LT.BlockTableRecordId, OpenMode.ForWrite) as BlockTableRecord;
                        BTR.AppendEntity(VP);
                        Trans.AddNewlyCreatedDBObject(VP, true);

                        LayoutManager.Current.SetCurrentLayoutId(LT.Id);
                        VP.On = true;
                        //恢复视图的图层状态
                        // ed.WriteMessage("\n<" + VR.LayerState + ">");
                        if (VR.LayerState != "")
                        {
                            layerState.RestoreLayerState(VR.LayerState, VP.Id, 1, LayerStateMasks.CurrentViewport);
                        }

                        //开始选择多段线裁剪视口
                        TypedValue[] Filter = new TypedValue[]
                        {
                            new TypedValue((int)DxfCode.Operator, "<and"),
                            new TypedValue((int)DxfCode.LayoutName, LT.LayoutName),
                            new TypedValue((int)DxfCode.LayerName, ClipLayerName),
                            new TypedValue((int)DxfCode.Operator, "<or"),
                            new TypedValue((int)DxfCode.Start, "POLYLINE"),
                            new TypedValue((int)DxfCode.Start, "POLYLINE3D"),
                            new TypedValue((int)DxfCode.Start, "POLYLINE2D"),
                            new TypedValue((int)DxfCode.Start, "LWPOLYLINE"),
                            new TypedValue((int)DxfCode.Operator, "or>"),
                            new TypedValue((int)DxfCode.Operator, "and>")
                        };
                        PromptSelectionResult selresult = ed.SelectAll(new SelectionFilter(Filter));
                        if (selresult.Status == PromptStatus.OK)
                        {
                            ObjectId[] IDs = selresult.Value.GetObjectIds();
                            VP.NonRectClipEntityId = IDs[0];
                            VP.NonRectClipOn       = true;
                            //ed.WriteMessage("\n呵呵,剪裁了视口哦");
                        }
                        else
                        {
                            ed.WriteMessage("\n布局“{0}”中未找到裁剪视口的多义线!视口裁剪失败!", LT.LayoutName);
                        }
                    }

                    Trans.Commit();
                }
                catch (Autodesk.AutoCAD.Runtime.Exception Ex)
                {
                    ed.WriteMessage("\n出错啦!{0}", Ex.ToString());
                }
                finally
                {
                    Trans.Dispose();
                }
            }
        }
Example #3
0
        public void MyCommand() // This method can have any name
        {
            LayerStateManager LayerState = db.LayerStateManager;
            int      viewnum             = 0;
            ObjectId SaveTableID         = InitialSave();

            if (SaveTableID == ObjectId.Null)
            {
                ed.WriteMessage("\n遇到问题,无法创建存档...");
                return;
            }
            int SaveNum = GetSave(SaveTableID);

            if (SaveNum != InitialNum)
            {
                PromptIntegerOptions InputOption = new PromptIntegerOptions("\n回车继续上次的编号,或者输入新的视图起始编号");
                InputOption.AllowNone    = true;
                InputOption.DefaultValue = SaveNum;
                PromptIntegerResult InputRes = ed.GetInteger(InputOption);
                if (InputRes.Status != PromptStatus.OK)
                {
                    return;
                }
                viewnum = InputRes.Value;
            }
            else
            {
                PromptIntegerResult numres = ed.GetInteger("\n输入视图起始编号");
                if (numres.Status != PromptStatus.OK)
                {
                    return;
                }
                viewnum = numres.Value;
            }
            int counter = 0;

            while (true)
            {
inputstart:
                PromptEntityOptions ops = new PromptEntityOptions("\n选择视图框");
                ops.SetRejectMessage("\n只能选择封闭的矩形!");
                ops.AddAllowedClass(typeof(Polyline), true);
                ops.AllowNone = false;
                ops.AllowObjectOnLockedLayer = true;
                PromptEntityResult res = ed.GetEntity(ops);
                if (res.Status != PromptStatus.OK)
                {
                    if (counter != 0)
                    {
                        UpdateSave(SaveTableID, viewnum);
                    }
                    ed.WriteMessage("\n共创建{0}个视图。", counter);
                    break;
                }
                using (Transaction trans = db.TransactionManager.StartTransaction())
                {
                    try
                    {
                        Polyline PL = trans.GetObject(res.ObjectId, OpenMode.ForRead) as Polyline;
                        if (PL.NumberOfVertices != 4 && !PL.Closed)
                        {
                            ed.WriteMessage("\n选择的不是封闭的矩形!");
                            goto inputstart;
                        }
                        Point3d  P1 = PL.GetPoint3dAt(0);
                        Point3d  P2 = PL.GetPoint3dAt(1);
                        Point3d  P3 = PL.GetPoint3dAt(2);
                        Point3d  P4 = PL.GetPoint3dAt(3);
                        Vector3d V1 = P1.GetVectorTo(P2);
                        Vector3d V2 = P2.GetVectorTo(P3);
                        Vector3d V3 = P3.GetVectorTo(P4);
                        Vector3d V4 = P4.GetVectorTo(P1);
                        if (!(V1.IsPerpendicularTo(V2) && V2.IsPerpendicularTo(V3) && V3.IsPerpendicularTo(V4)))
                        {
                            ed.WriteMessage("\n选择的不是封闭的矩形!");
                            goto inputstart;
                        }
                        Point2d CT = new Point2d((P1.X + P3.X) / 2, (P1.Y + P3.Y) / 2);
                        double  H  = 1;
                        double  W  = 1;

                        if (V1.Length > V4.Length)
                        {
                            H = V4.Length;
                            W = V1.Length;
                        }
                        else
                        {
                            H = V1.Length;
                            W = V4.Length;
                        }


                        Vector2d UserXaxix  = new Vector2d(db.Ucsxdir.X, db.Ucsxdir.Y);
                        Vector2d WXaxix     = new Vector2d(1, 0);
                        double   TwistAngle = WXaxix.GetAngleTo(UserXaxix);
                        if (db.Ucsxdir.Y > 0)
                        {
                            TwistAngle = Math.PI * 2 - WXaxix.GetAngleTo(UserXaxix);
                        }

                        //Matrix2d WCS2DCS = Matrix2d.Rotation(new Vector2d(1, 0).GetAngleTo(UserXaxix),new Point2d(0,0));
                        Matrix2d WCS2DCS   = Matrix2d.Rotation(TwistAngle, new Point2d(0, 0));
                        Point3d  UcsCenter = db.Ucsorg;
                        //Point2d DcsCenter = new Point2d(UcsCenter.X, UcsCenter.Y).TransformBy(TransWCSToDCS);
                        Point2d DcsCenter = CT.TransformBy(WCS2DCS);

                        /*
                         * ed.WriteMessage("\n计算旋转角:{0}", WXaxix.GetAngleTo(UserXaxix));
                         * ed.WriteMessage("\nTwistAngle:{0}", TwistAngle);
                         * ed.WriteMessage("\nWCS的中点:{0}", CT.ToString());
                         * ed.WriteMessage("\nUCS的中点:{0}", new Point3d(CT.X,CT.Y,0).TransformBy(ed.CurrentUserCoordinateSystem).ToString());
                         * ed.WriteMessage("\nDCS的中点:{0}", DcsCenter.ToString());
                         */


                        SymbolTable VT = trans.GetObject(db.ViewTableId, OpenMode.ForWrite) as SymbolTable;
                        if (VT.Has(viewnum.ToString()))
                        {
                            foreach (ObjectId viewid in VT)
                            {
                                ViewTableRecord VR = trans.GetObject(viewid, OpenMode.ForWrite) as ViewTableRecord;
                                if (VR.Name == viewnum.ToString())
                                {
                                    VR.Erase();
                                    break;
                                }
                            }
                        }
                        ViewTableRecord NewVr = new ViewTableRecord();
                        NewVr.Name = viewnum.ToString();

                        NewVr.CenterPoint = DcsCenter;
                        NewVr.Height      = H;
                        NewVr.Width       = W;
                        NewVr.ViewTwist   = TwistAngle;
                        NewVr.SetUcs(db.Ucsorg, db.Ucsxdir, db.Ucsydir);
                        VT.Add(NewVr);
                        trans.AddNewlyCreatedDBObject(NewVr, true);
                        //添加图层快照属性要在把view添加到数据库里后再操作,要不会报错eNoDataBase...
                        string LayerStateName = string.Format("ACAD_VIEWS_{0}", NewVr.Name);
                        //已有同名那就删掉
                        if (LayerState.HasLayerState(LayerStateName))
                        {
                            LayerState.DeleteLayerState(LayerStateName);
                        }
                        LayerState.SaveLayerState(LayerStateName, LayerStateMasks.None, new ObjectId());
                        NewVr.LayerState = LayerStateName;
                        trans.Commit();
                        ed.WriteMessage("\n成功创建编号为{0}的视图。", viewnum);
                        viewnum++;
                        counter++;
                    }
                    catch (Autodesk.AutoCAD.Runtime.Exception EX)
                    {
                        ed.WriteMessage("\n出错了!{0}", EX.ToString());
                    }
                    finally
                    {
                        trans.Dispose();
                    }
                }
            }
        }