Esempio n. 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;
            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();
                }
            }
        }
Esempio n. 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;
            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();
                }
            }
        }