Пример #1
0
        public static void CADRead(string filename)
        {
            Document doc               = Application.DocumentManager.Open(filename, false);
            Database db                = doc.Database;
            var      CurEditor         = doc.Editor;
            double   f                 = 1.0;
            PromptSelectionOptions pso = new PromptSelectionOptions();

            pso.MessageForAdding = "\nSelect annotative objects";
            var psr = CurEditor.GetSelection(pso);

            if (psr.Status != PromptStatus.OK)
            {
                return;
            }
            var map = new Dictionary <ObjectId, string>();

            foreach (dynamic id in psr.Value.GetObjectIds())
            {
                map.Add(id, id.Layer);
            }

            var sorted = map.OrderBy(kv => kv.Value);

            // Print them in order to the command-line


            foreach (var item in sorted)
            {
                CurEditor.WriteMessage("\nObject {0} on layer {1}", item.Key, item.Value);
            }


            doc.CloseAndDiscard();
        }
Пример #2
0
        public static List <T> GetObjectsFromSelection <T>(Database db, Editor ed, string[] layers = null, string[] blocknames = null, int[] colors = null) where T : class
        {
            var objs = new List <T>();

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                BlockTable bt  = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
                var        pso = new PromptSelectionOptions();
                pso.RejectObjectsOnLockedLayers = true;
                PromptSelectionResult psr = ed.GetSelection(pso);
                if (psr.Status == PromptStatus.OK)
                {
                    SelectionSet ss = psr.Value;
                    foreach (SelectedObject item in ss)
                    {
                        if (item != null)
                        {
                            Entity ent = (Entity)tr.GetObject(item.ObjectId, OpenMode.ForRead);
                            if (ent.GetType() == typeof(T) &&
                                (layers == null ? true : Array.IndexOf(layers, ent.Layer) >= 0) &&
                                (blocknames == null ? true : Array.IndexOf(blocknames, ((BlockReference)ent).Name) >= 0) &&
                                (colors == null ? true : Array.IndexOf(colors, ent.ColorIndex) >= 0))
                            {
                                T obj = ent as T;
                                objs.Add(obj);
                            }
                        }
                    }
                }
                tr.Commit();
            }
            return(objs);
        }
Пример #3
0
        private static ObjectId FetchFFLBlockID()
        {
            Document acDoc    = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument;
            Database acCurrDb = acDoc.Database;
            Editor   acEditor = acDoc.Editor;

            // Create the selection filter for the FFL block
            TypedValue[] selFilterList = new TypedValue[2];
            selFilterList[0] = new TypedValue(0, "INSERT");
            selFilterList[1] = new TypedValue(2, "JPP_App_Outline*");

            SelectionFilter selFilter = new SelectionFilter(selFilterList);

            // Set prompt options and message
            PromptSelectionOptions selOptions = new PromptSelectionOptions();

            selOptions.MessageForAdding  = "Select FFL block: ";
            selOptions.SinglePickInSpace = true;
            selOptions.SingleOnly        = true;

            // Prompt user to select FFL add exposed brickwork
            PromptSelectionResult selResult = acEditor.GetSelection(selOptions, selFilter);

            ObjectId[] FFLToEditId = selResult.Value.GetObjectIds();
            ObjectId   blockId     = FFLToEditId[0];

            using (Transaction acTrans = acCurrDb.TransactionManager.StartTransaction())
            {
                try
                {
                    BlockTable       acBlkTbl    = acTrans.GetObject(acCurrDb.BlockTableId, OpenMode.ForRead) as BlockTable;
                    BlockReference   fflBlock    = acTrans.GetObject(blockId, OpenMode.ForRead) as BlockReference;
                    BlockTableRecord acBlkTblRec = acTrans.GetObject(acBlkTbl[fflBlock.Name],
                                                                     OpenMode.ForRead) as BlockTableRecord;
                    if (acBlkTblRec == null)
                    {
                        acEditor.WriteMessage("\nError FFL block not found.");
                        acTrans.Commit();
                        return(ObjectId.Null);
                    }
                    // Check there is only one instance of this block reference in the drawing
                    if (acBlkTblRec.GetBlockReferenceIds(false, true).Count != 1)
                    {
                        acEditor.WriteMessage("\nError more than one instance of the block reference.");
                        acTrans.Commit();
                        return(ObjectId.Null);
                    }
                    acTrans.Commit();
                    return(fflBlock.ObjectId);
                }
                catch (Autodesk.AutoCAD.Runtime.Exception acException)
                {
                    Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog
                        ("The following exception was caught: \n" + acException.Message
                        + "\nError retrieving FFL Block Id!\n");
                    acTrans.Abort();
                    return(ObjectId.Null);
                }
            }
        }
Пример #4
0
        buildSSetBase(TypedValue[] tvs, bool selectAll = true, string prompt = "")
        {
            SelectionFilter        filter = new SelectionFilter(tvs);
            PromptSelectionOptions pso    = new PromptSelectionOptions();

            pso.MessageForAdding  = prompt;
            pso.MessageForRemoval = "";

            PromptSelectionResult psr = null;

            if (selectAll)
            {
                psr = BaseObjs._editor.SelectAll(filter);
            }
            else
            {
                psr = BaseObjs._editor.GetSelection(pso, filter);
            }

            if (psr.Status == PromptStatus.OK)
            {
                return(psr.Value);
            }
            else
            {
                return(null);
            }
        }
Пример #5
0
        public static bool TrySelectObjects <T>(out List <T> selectedSet, string message = "\nВыберите объект: ")
            where T : DBObject
        {
            selectedSet = new List <T>();
            Editor ed = Tools.GetAcadEditor();

            PromptSelectionOptions pso = new PromptSelectionOptions();

            pso.MessageForAdding   = message;
            pso.AllowDuplicates    = false;
            pso.AllowSubSelections = true;
            pso.RejectObjectsFromNonCurrentSpace = true;
            pso.RejectObjectsOnLockedLayers      = false;

            PromptSelectionResult psr = ed.GetSelection(pso);

            if (psr.Status != PromptStatus.OK)
            {
                return(false);
            }

            using (Transaction trans = Tools.StartTransaction())
            {
                foreach (SelectedObject so in psr.Value)
                {
                    T obj = trans.GetObject(so.ObjectId, OpenMode.ForRead) as T;
                    if (obj != null)
                    {
                        selectedSet.Add(obj);
                    }
                }
            }
            return(true);
        }
Пример #6
0
        public void MidPoint()
        {
            Document doc = GetDocument();
            Database db  = doc.Database;
            Editor   ed  = doc.Editor;

            try
            {
                using (Transaction trans = db.TransactionManager.StartTransaction())
                {
                    PromptSelectionOptions pso    = new PromptSelectionOptions();
                    TypedValue[]           tv     = new TypedValue[] { new TypedValue(0, "POINT") };
                    SelectionFilter        filter = new SelectionFilter(tv);

                    PromptSelectionResult psr = ed.GetSelection(filter);

                    if (psr.Status != PromptStatus.OK)
                    {
                        return;
                    }

                    var    res = psr.Value.GetObjectIds();
                    double x = 0, y = 0;
                    int    n = 0;
                    foreach (ObjectId objectId in res)
                    {
                        var pt = trans.GetObject(objectId, OpenMode.ForRead) as DBPoint;
                        if (pt != null)
                        {
                            n++;
                            x += pt.Position.X;
                            y += pt.Position.Y;
                        }
                    }
                    if (n == 0)
                    {
                        return;
                    }

                    var avgPt = new Point3d(x / n, y / n, 0);

                    BlockTable bt = trans.GetObject(db.BlockTableId
                                                    , OpenMode.ForRead) as BlockTable;

                    BlockTableRecord btr = trans.GetObject(
                        bt[BlockTableRecord.ModelSpace],
                        OpenMode.ForWrite) as BlockTableRecord;

                    DBPoint po = new DBPoint(avgPt);
                    btr.AppendEntity(po);
                    trans.AddNewlyCreatedDBObject(po, true);

                    trans.Commit();
                }
            }
            catch (Autodesk.AutoCAD.Runtime.Exception ex)
            {
                ed.WriteMessage(ex.Message + ex.StackTrace);
            }
        }
Пример #7
0
        public static SelectionSet getss()
        {
            Editor editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;

            TypedValue[] array = new TypedValue[0];

            PromptSelectionOptions promptSelectionOptions = new PromptSelectionOptions();

            promptSelectionOptions.MessageForAdding   = "";
            promptSelectionOptions.AllowSubSelections = true;
            promptSelectionOptions.AllowDuplicates    = (false);

            PromptSelectionResult selection = editor.GetSelection(promptSelectionOptions, new SelectionFilter(array));

            if (selection.Status == (PromptStatus)(-5002))
            {
                return(null);
            }
            if (selection.Status != (PromptStatus)5100)
            {
                return(null);
            }

            return(selection.Value);
        }
Пример #8
0
        public SelectionSet selectPoints(string message)
        {
            Document DOC = Application.DocumentManager.MdiActiveDocument;
            Database DB  = DOC.Database;
            Editor   ED  = Application.DocumentManager.MdiActiveDocument.Editor;

            TypedValue[] TVs = new TypedValue[1];
            TVs.SetValue(new TypedValue((int)DxfCode.Start, "AECC_COGO_POINT"), 0);

            SelectionFilter        FILTER = new SelectionFilter(TVs);
            PromptSelectionOptions PSO    = new PromptSelectionOptions();

            PSO.MessageForAdding = message;

            PromptSelectionResult PSR = null;

            using (Transaction TR = DB.TransactionManager.StartTransaction())
            {
                try
                {
                    PSR = ED.GetSelection(PSO, FILTER);
                }
                catch (System.Exception ex) {
                    Application.ShowAlertDialog(ex.Message + " DragLabel.cs: line: 73");
                    BaseObjs.writeDebug(ex.Message + " DragLabel.cs: line: 73");
                }
                if (PSR.Status == PromptStatus.OK)
                {
                    return(PSR.Value);
                }
            }
            return(null);
        } // selectPoints
Пример #9
0
        /// <summary>
        /// 사용자가 선택한 여러 객체들을 가져오는 메소드입니다.
        /// </summary>
        /// <param name="message">선택 전, 프롬프트에 표시할 메시지</param>
        /// <param name="Filter">선택이 가능하게 할 조건</param>
        /// <returns></returns>
        public static ObjectId[] GetEntities(string message = "객체 선택", params TypedValue[] Filter)
        {
            ActivateApplication();

            Document doc = AcadApp.DocumentManager.MdiActiveDocument;
            Database db  = doc.Database;
            Editor   ed  = doc.Editor;

            PromptSelectionOptions pso = new PromptSelectionOptions();

            pso.MessageForAdding  = "\n" + message;
            pso.MessageForRemoval = "\n" + message;

            SelectionFilter oSF = new SelectionFilter(Filter);

            PromptSelectionResult psr = ed.GetSelection(pso, oSF);

            if (psr.Status != PromptStatus.OK)
            {
                return new ObjectId[] { }
            }
            ;

            return(psr.Value.GetObjectIds());
        }
Пример #10
0
        public void KHatch()
        {
            Database db = HostApplicationServices.WorkingDatabase;
            Editor   ed = Application.DocumentManager.MdiActiveDocument.Editor;

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                BlockTable       blockTbl   = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                BlockTableRecord modelSpace = tr.GetObject(blockTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;

                PromptSelectionOptions kh = new PromptSelectionOptions
                {
                    MessageForAdding = "请选择厨房进行填充"
                };

                PromptSelectionResult selectionResult = ed.GetSelection(kh);
                if (selectionResult.Status != PromptStatus.OK)
                {
                    return;
                }
                List <ObjectId> objectIds = new List <ObjectId>(selectionResult.Value.GetObjectIds());

                CreateHatch("JIS_LC_20", modelSpace, tr, objectIds);
            }
        }
Пример #11
0
        private static Curve[] SelectPolylines(Editor ed, string message)
        {
            var filterType = new[]
            {
                new TypedValue((int)DxfCode.Operator, "<OR"),
                new TypedValue((int)DxfCode.Start, "LWPOLYLINE"),
                new TypedValue((int)DxfCode.Start, "POLYLINE"),
                new TypedValue((int)DxfCode.Operator, "OR>"),
            };

            // 点选
            var peO = new PromptSelectionOptions();

            peO.MessageForAdding  = "\n" + message; // 当用户在命令行中输入A(或Add)时,命令行出现的提示字符。
            peO.MessageForRemoval = "\n" + message;

            // 请求在图形区域选择对象
            var res = ed.GetSelection(peO, new SelectionFilter(filterType));

            // 如果提示状态OK,表示对象已选
            if (res.Status == PromptStatus.OK)
            {
                return(res.Value.GetObjectIds().Select(r => r.GetObject(OpenMode.ForRead)).OfType <Curve>().ToArray());
            }
            return(null);
        }
Пример #12
0
        static ObjectIdCollection GetSelectPolyline(bool isSingleSelect)
        {
            //过滤选择polyline
            var tvs = new[]
            {
                new TypedValue((int)DxfCode.Operator, "<or"),
                new TypedValue((int)DxfCode.Start, "LWPOLYLINE"),
                new TypedValue((int)DxfCode.Start, "POLYLINE"),
                new TypedValue((int)DxfCode.Operator, "or>")
            };
            var filter        = new SelectionFilter(tvs);
            var selectionOpts = new PromptSelectionOptions {
                SingleOnly = isSingleSelect
            };

            var currDoc = Application.DocumentManager.MdiActiveDocument;
            //选择polyline
            PromptSelectionResult result = currDoc.Editor.GetSelection(selectionOpts, filter);

            if (result.Status == PromptStatus.OK && result.Value.Count >= 1)
            {
                return(new ObjectIdCollection(result.Value.GetObjectIds()));
            }

            return(new ObjectIdCollection());
        }
Пример #13
0
        /// <summary> 选择单行或者多行文字 </summary>
        public static ObjectId[] SelectElements(DocumentModifier docMdf)
        {
            // 创建一个 TypedValue 数组,用于定义过滤条件
            var filterTypes = new TypedValue[]
            {
                new TypedValue((int)DxfCode.Operator, "<OR"),
                new TypedValue((int)DxfCode.Start, "TEXT"),
                new TypedValue((int)DxfCode.Start, "MTEXT"),
                new TypedValue((int)DxfCode.Operator, "OR>")
            };

            var op = new PromptSelectionOptions();

            // Set our prompts to include our keywords
            op.MessageForAdding  = "\n选择单行或者多行文字以进行正则表达式查询或替换"; // 当用户在命令行中输入A(或Add)时,命令行出现的提示字符。
            op.MessageForRemoval = op.MessageForAdding;


            // 请求在图形区域选择对象
            var res = docMdf.acEditor.GetSelection(new SelectionFilter(filterTypes));

            // 如果提示状态OK,表示对象已选
            if (res.Status == PromptStatus.OK)
            {
                var acSSet = res.Value;
                return(acSSet.GetObjectIds());
            }
            return(null);
        }
        /// <summary>
        /// Получение выделенных объектов с учетом заданного фильтра. При этом учитывается возможность предварительного выбора объектов.
        /// </summary>
        /// <param name="ed"></param>
        /// <param name="pso"></param>
        /// <param name="filterObjectMethod">Метод, по которому происходит фильтрация объектов</param>
        /// <returns></returns>
        public static PromptSelectionResult GetFilteredSelection(this Editor ed, PromptSelectionOptions pso, Func <ObjectId, bool> filterObjectMethod)
        {
            _filterObjectMethod = filterObjectMethod;
            PromptSelectionResult res = ed.SelectImplied();

            //IEnumerable<ObjectId> filteredObjects = null;

            if (res.Status == PromptStatus.OK)
            {
                var filteredObjects = res.GetSelectedObjectIds().Where(id => _filterObjectMethod(id));
                ed.SetImpliedSelection(filteredObjects.ToArray());
                res = ed.SelectImplied();
                //ed.SetImpliedSelection(new ObjectId[0]);
            }
            else
            {
                SelectionAddedEventHandler selHandler = new SelectionAddedEventHandler(ed_SelectionAdded);
                ed.SelectionAdded += selHandler;
                res = ed.GetSelection(pso);
                ed.SelectionAdded -= selHandler;
            }

            _filterObjectMethod = null;
            return(res);
        }
Пример #15
0
        public void FDOSelectSingle()
        {
            Core.ClearImpliedSelection();

            PromptSelectionOptions std_opts = new PromptSelectionOptions();

            std_opts.MessageForAdding  = "Выберите объекты карты (FDO) (Esc для выхода):";
            std_opts.MessageForRemoval = std_opts.MessageForAdding;

            std_opts.SingleOnly = true;
            //std_opts.SetKeywords("[вЫход]", "eXit");
            //std_opts.Keywords.Default = "eXit";

            PromptSelectionResult sel_result = Core.current_editor.GetSelection(std_opts);             // выбор объектов

            if (sel_result.Status == PromptStatus.OK)
            {
                // преобразование SelectionSet'а AutoCAD'а в выборку MgSelectionBase (только объекты FDO)
                MgSelectionBase selection_base = AcMapFeatureEntityService.GetSelection(sel_result.Value);

                // установка активной выборки
                SelectionSet new_sel_set = AcMapFeatureEntityService.AddFeaturesToSelectionSet(null, selection_base);
                Core.current_editor.SetImpliedSelection(new_sel_set);
            }
            Core.WriteMessage("\n");
        }
Пример #16
0
        public List <ObjectId> Select(bool withRegions)
        {
            // Запрос региона
            if (withRegions)
            {
                Estimate = PromptRegion();
            }
            else
            {
                Estimate = new EstimateMoscowRegion();
            }

            PromptSelectionResult res;
            var prOpt = new PromptSelectionOptions();

            prOpt.MessageForAdding  = "\nВыбор блоков блок-секций. ";
            prOpt.MessageForRemoval = "\nИсключено из набора";
            res = _doc.Editor.GetSelection(prOpt);

            if (res.Status != PromptStatus.OK)
            {
                throw new Exception("Отменено пользователем.");
            }

            var idsSel = res.Value.GetObjectIds().ToList();

            return(idsSel);
        }
Пример #17
0
        /// <summary>
        /// </summary>
        /// <param name="docMdf"></param>
        /// <returns></returns>
        private static ObjectId[] SelectDims(DocumentModifier docMdf)
        {
            var ed = docMdf.acEditor;

            var filterType = new[]
            {
                new TypedValue((int)DxfCode.Start, "DIMENSION"),
                // 将标注类型限制为转角标注与对齐标注
                new TypedValue((int)DxfCode.Operator, "<OR"),
                new TypedValue(100, "AcDbAlignedDimension)"),
                new TypedValue(100, "AcDbRotatedDimension))"),
                new TypedValue((int)DxfCode.Operator, "OR>")
            };
            var filter = new SelectionFilter(filterType);

            // Create our options object
            var pso = new PromptSelectionOptions();
            var kws = pso.Keywords.GetDisplayString(true);

            pso.MessageForAdding  = $"\n选择标注对象";          // 当用户在命令行中输入A(或Add)时,命令行出现的提示字符。
            pso.MessageForRemoval = pso.MessageForAdding; // 当用户在命令行中输入Re(或Remove)时,命令行出现的提示字符。


            var res = ed.GetSelection(pso, filter);

            if (res.Status == PromptStatus.OK)
            {
                return(res.Value.GetObjectIds());
            }
            return(null);
        }
Пример #18
0
        public void Select()
        {
            var prOpt = new PromptSelectionOptions();

            prOpt.MessageForAdding = "Выбор блоков блок-секций";
            var res = _ss.Doc.Editor.GetSelection(prOpt);

            if (res.Status != PromptStatus.OK)
            {
                throw new Exception("Отменено пользователем.");
            }
            IdsBlRefSections = new List <ObjectId>();
            foreach (ObjectId idEnt in res.Value.GetObjectIds())
            {
                if (idEnt.ObjectClass.Name == "AcDbBlockReference")
                {
                    using (var blRef = idEnt.Open(OpenMode.ForRead, false, true) as BlockReference)
                    {
                        var name = blRef.GetEffectiveName();
                        if (name.StartsWith(Settings.Default.BlockSectionPrefix, StringComparison.OrdinalIgnoreCase))
                        {
                            IdsBlRefSections.Add(idEnt);
                        }
                    }
                }
            }
        }
Пример #19
0
        public void GetPointOrString()
        {
            PromptSelectionOptions pnt_opts = new PromptSelectionOptions();

            //pnt_opts.Message = "\nPick point";

            // Define the valid keywords and allow Enter
            //pnt_opts.AllowArbitraryInput = true;
            //pnt_opts.AllowNone = true;
            pnt_opts.UnknownInput += Pnt_opts_UnknownInput;
            //pnt_opts.KeywordInput += Pnt_opts_KeywordInput;

            // Get the value entered by the user
            try
            {
                PromptSelectionResult pIntRes = AcadFuncs.GetActiveDoc().Editor.GetSelection(pnt_opts);
            }
            catch (System.Exception ex)
            {
            }
            MessageBox.Show(UnknownInput);

            pnt_opts.UnknownInput -= Pnt_opts_UnknownInput;
            //pnt_opts.KeywordInput -= Pnt_opts_KeywordInput;
        }
Пример #20
0
        public static bool TrySelectObjects <T>(out IList <T> objCollection, OpenMode openMode, string msg, Transaction transaction)
            where T : DBObject
        {
            Editor       ed  = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            SelectionSet set = null;

            objCollection = null;
            PromptSelectionOptions opt = new PromptSelectionOptions();

            opt.AllowDuplicates = false;

            PromptSelectionResult res = ed.GetSelection(opt);

            if (res.Status == PromptStatus.OK)
            {
                if ((set = res.Value) != null)
                {
                    ObjectId[] ids = set.GetObjectIds();
                    objCollection = new List <T>(set.Count);
                    foreach (ObjectId id in ids)
                    {
                        DBObject dbobj = transaction.GetObject(id, openMode, true);
                        T        val   = dbobj as T;
                        if (val != null)
                        {
                            objCollection.Add(val);
                        }
                    }

                    ed.WriteMessage(string.Format("\n{0} selected points", objCollection.Count));
                    return(true);
                }
            }
            return(false);
        }
Пример #21
0
        public static void AnnotatePipe()
        {
            Document acDoc   = Application.DocumentManager.MdiActiveDocument;
            Database acCurDb = acDoc.Database;

            PromptSelectionOptions pso = new PromptSelectionOptions();

            pso.SingleOnly = true;
            PromptSelectionResult psr = acDoc.Editor.GetSelection(pso);

            if (psr.Status == PromptStatus.OK)
            {
                using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
                {
                    foreach (SelectedObject so in psr.Value)
                    {
                        DBObject obj = acTrans.GetObject(so.ObjectId, OpenMode.ForRead);

                        if (obj is Polyline3d)
                        {
                            Annotate(obj as Polyline3d);
                        }
                        else
                        {
                            acDoc.Editor.WriteMessage("Object is not a polyline\n");
                        }
                    }

                    acTrans.Commit();
                }
            }
        }
Пример #22
0
        public static void SplitFoundation()
        {
            Document acDoc   = Application.DocumentManager.MdiActiveDocument;
            Database acCurDb = acDoc.Database;

            PromptSelectionOptions pso = new PromptSelectionOptions();

            pso.SingleOnly = true;
            PromptSelectionResult psr = acDoc.Editor.GetSelection(pso);

            List <Curve> allLines = new List <Curve>();

            if (psr.Status == PromptStatus.OK)
            {
                using (Transaction tr = acCurDb.TransactionManager.StartTransaction())
                {
                    foreach (SelectedObject so in psr.Value)
                    {
                        DBObject obj = tr.GetObject(so.ObjectId, OpenMode.ForRead);

                        if (obj is Curve)
                        {
                            Curve c = obj as Curve;
                            c.UpgradeOpen();
                            allLines.Add(c);
                        }
                    }

                    SplitFoundation(allLines);

                    tr.Commit();
                }
            }
        }
Пример #23
0
        /// <summary>
        /// Prompts the user to do a selection of one or more objects.
        /// </summary>
        /// <param name="message">Message to display in the command line.</param>
        public static DBObjectCollection GetSelection(string message, ref PromptStatus status,
                                                      Transaction transaction, OpenMode mode, bool openErased, bool forceOpenOnLockedLayer)
        {
            PromptSelectionOptions options = new PromptSelectionOptions();
            PromptSelectionResult  result;
            SelectionSet           selection;
            Editor             command         = Application.DocumentManager.MdiActiveDocument.Editor;
            DBObjectCollection objectsSelected = new DBObjectCollection();

            options.MessageForAdding = System.Environment.NewLine + message;
            result = command.GetSelection(options);
            status = result.Status;

            ObjectId[] idArray;
            DBObject   dbObject;

            selection = result.Value;

            if (selection != null)
            {
                idArray = selection.GetObjectIds();

                foreach (ObjectId id in idArray)
                {
                    dbObject = transaction.GetObject(id, mode, openErased, forceOpenOnLockedLayer);
                    objectsSelected.Add(dbObject);
                }
            }

            return(objectsSelected);
        }
Пример #24
0
        /// <summary> 选择多段线以修改其疏密 </summary>
        private static Polyline[] SelectPolylines(DocumentModifier docMdf)
        {
            var ed = docMdf.acEditor;

            var filterType = new[]
            {
                new TypedValue((int)DxfCode.Start, "LWPOLYLINE")
            };
            var filter = new SelectionFilter(filterType);

            // Create our options object
            var pso = new PromptSelectionOptions();
            var kws = pso.Keywords.GetDisplayString(true);

            pso.MessageForAdding  = $"\n选择多段线以修改其疏密";     // 当用户在命令行中输入A(或Add)时,命令行出现的提示字符。
            pso.MessageForRemoval = pso.MessageForAdding; // 当用户在命令行中输入Re(或Remove)时,命令行出现的提示字符。


            var res = ed.GetSelection(pso, filter);

            if (res.Status == PromptStatus.OK)
            {
                return
                    (res.Value.GetObjectIds().Select(id => id.GetObject(OpenMode.ForRead)).OfType <Polyline>().ToArray());
            }
            return(null);
        }
Пример #25
0
        /// <summary>选择多个单行或者多行文字 </summary>
        /// <param name="docMdf"></param>
        /// <returns></returns>
        private static ObjectId[] SelectTexts(DocumentModifier docMdf)
        {
            var ed = docMdf.acEditor;

            var filterType = new[]
            {
                new TypedValue((int)DxfCode.Operator, "<OR"),
                new TypedValue((int)DxfCode.Start, "TEXT"),
                new TypedValue((int)DxfCode.Start, "MTEXT"),
                new TypedValue((int)DxfCode.Operator, "OR>")
            };
            var filter = new SelectionFilter(filterType);

            // Create our options object
            var pso = new PromptSelectionOptions();
            var kws = pso.Keywords.GetDisplayString(true);

            pso.MessageForAdding  = $"\n选择单行或者多行文字";      // 当用户在命令行中输入A(或Add)时,命令行出现的提示字符。
            pso.MessageForRemoval = pso.MessageForAdding; // 当用户在命令行中输入Re(或Remove)时,命令行出现的提示字符。

            var res = ed.GetSelection(pso, filter);

            if (res.Status == PromptStatus.OK)
            {
                return(res.Value.GetObjectIds());
            }
            return(null);
        }
Пример #26
0
        /// <summary>选择多个多面网格 </summary>
        /// <param name="docMdf"></param>
        /// <returns></returns>
        private static ObjectId[] SelectPolyfacemeshes(DocumentModifier docMdf)
        {
            var ed = docMdf.acEditor;

            var filterType = new[]
            {
                new TypedValue((int)DxfCode.Start, "POLYLINE"),
                new TypedValue((int)100, "AcDbPolyFaceMesh")
            };
            var filter = new SelectionFilter(filterType);

            // Create our options object
            var pso = new PromptSelectionOptions();
            var kws = pso.Keywords.GetDisplayString(true);

            pso.MessageForAdding  = $"\n选择多面网格";          // 当用户在命令行中输入A(或Add)时,命令行出现的提示字符。
            pso.MessageForRemoval = pso.MessageForAdding; // 当用户在命令行中输入Re(或Remove)时,命令行出现的提示字符。

            var res = ed.GetSelection(pso, filter);

            if (res.Status == PromptStatus.OK)
            {
                return(res.Value.GetObjectIds());
            }
            return(null);
        }
Пример #27
0
        selectMTextForMoving(string layer, out bool escape)
        {
            escape = true;
            ObjectId id = ObjectId.Null;

            TypedValue[] TVs = new TypedValue[2];

            TVs.SetValue(new TypedValue((int)DxfCode.Start, "MTEXT"), 0);
            TVs.SetValue(new TypedValue((int)DxfCode.LayerName, layer), 1);

            SelectionFilter filter = new SelectionFilter(TVs);

            PromptSelectionOptions pso = new PromptSelectionOptions();

            pso.MessageForAdding = "Select MText to Move";

            PromptSelectionResult PSR = BaseObjs._editor.GetSelection(pso, filter);

            if (PSR.Status == PromptStatus.OK)
            {
                id     = PSR.Value.GetObjectIds()[0];
                escape = false;
            }
            return(id);
        }
Пример #28
0
        /// <summary> 选择多个单行文字 </summary>
        /// <param name="docMdf"></param>
        /// <returns></returns>
        private static List <DBText> GetDbTexts(DocumentModifier docMdf)
        {
            // Create our options object
            var pso = new PromptSelectionOptions();

            // Add our keywords
            // Set our prompts to include our keywords
            string kws = pso.Keywords.GetDisplayString(true);

            pso.MessageForAdding  = "\n 选择多个单行文字" + kws; // 当用户在命令行中输入A(或Add)时,命令行出现的提示字符。
            pso.MessageForRemoval = "\n 选择多个单行文字 " + kws;
            // 当用户在命令行中输入Re(或Remove)时,命令行出现的提示字符。
            var f     = new SelectionFilter(new TypedValue[] { new TypedValue((int)DxfCode.Start, "TEXT") });
            var texts = new List <DBText>();
            var res   = docMdf.acEditor.GetSelection(pso, f);

            if (res.Status == PromptStatus.OK)
            {
                var ids = res.Value.GetObjectIds();
                foreach (var id in ids)
                {
                    var text = id.GetObject(OpenMode.ForRead) as DBText;
                    if (text != null)
                    {
                        texts.Add(text);
                    }
                }
            }
            return(texts);
        }
Пример #29
0
        public static List<ObjectId> GetBlockRefPanels(Document doc)
        {
            // Выбор блоков панелей в чертеже.
             List<ObjectId> ids = new List<ObjectId>();

             Editor ed = doc.Editor;
             Database db = doc.Database;
             var prOpt = new PromptSelectionOptions();
             prOpt.MessageForAdding = "Выбор блоков панелей";
             var selRes = ed.GetSelection(prOpt);
             if (selRes.Status != PromptStatus.OK)
            return ids;

             // Фильтр блоков панелей (по имени блоков).
             using (var t = db.TransactionManager.StartTransaction())
             {
            foreach (ObjectId idEnt in selRes.Value.GetObjectIds())
            {
               if (idEnt.ObjectClass.Name == "AcDbBlockReference")
               {
                  var blRef = t.GetObject(idEnt, OpenMode.ForRead) as BlockReference;
                  // Пока выбираем только блок с именем "НС4_72-75"
                  if (GetEffectiveBlockName(blRef) == "НС4_72-75")
                  {
                     ids.Add(idEnt);
                  }
               }
            }
            t.Commit();
             }
             return ids;
        }
Пример #30
0
        private void createGroup(string groupName)
        {
            Editor   ed = Application.DocumentManager.MdiActiveDocument.Editor;
            Database db = HostApplicationServices.WorkingDatabase;

            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                //新建一个组对象
                Group gp = new Group(groupName, true);
                //打开当前数据库的组字典对象以加入新建的组对象
                DBDictionary dict = (DBDictionary)trans.GetObject(db.GroupDictionaryId, OpenMode.ForWrite);
                //在组字典中将组对象作为一个新条目加入,并指定它的搜索关键字为groupName
                dict.SetAt(groupName, gp);
                //下面的操作用来选择组中要包含的对象
                PromptSelectionOptions opt = new PromptSelectionOptions();
                opt.MessageForAdding = "请选择组中要包含的对象";
                PromptSelectionResult res = ed.GetSelection(opt);
                if (res.Status != PromptStatus.OK)
                {
                    return;
                }
                //获取所选择对象的ObjectId集合
                SelectionSet       ss  = res.Value;
                ObjectIdCollection ids = new ObjectIdCollection(ss.GetObjectIds());
                //在组对象中加入所选择的对象
                gp.Append(ids);
                //通知事务处理完成组对象的加入
                trans.AddNewlyCreatedDBObject(gp, true);
                trans.Commit();
            }
        }
Пример #31
0
        public void List()
        {
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;

            try
            {
                PromptSelectionOptions Opts = new PromptSelectionOptions();

                //Build	a filter list so that only block references	are	selected
                TypedValue[] filList = { new TypedValue((int)DxfCode.Start, "INSERT") };

                SelectionFilter       filter = new SelectionFilter(filList);
                PromptSelectionResult res    = ed.GetSelection(Opts, filter);

                //Do nothing if	selection is unsuccessful
                if (res.Status != PromptStatus.OK)
                {
                    return;
                }

                Autodesk.AutoCAD.EditorInput.SelectionSet SS = res.Value;
                ObjectId[] idArray = SS.GetObjectIds();

                //List the selection set
                EmployeeCount(idArray);
            }
            catch
            {
            }
        }
Пример #32
0
 public static void SelectEnt()
 {
     //��ȡEditor����
        Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
        PromptSelectionOptions selectionOp = new PromptSelectionOptions();
        PromptSelectionResult ssRes = ed.GetSelection(selectionOp);
        if (ssRes.Status == PromptStatus.OK)
        {
            SelectionSet SS = ssRes.Value;
            int nCount = SS.Count;
            ed.WriteMessage("ѡ����{0}��ʵ��"  , nCount);
        }
 }
Пример #33
0
        public static void SelectEnt2()
        {
            //��ȡEditor����
               Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

                // ����ѡ��ѡ��
               PromptSelectionOptions selectionOp = new PromptSelectionOptions();
                 //����ѡ�񼯹�������ֻѡ������
                TypedValue[] filList = new TypedValue[1];
                filList[0] = new TypedValue((int)DxfCode.Start, "INSERT");
               SelectionFilter filter = new SelectionFilter(filList);

               PromptSelectionResult ssRes = ed.GetSelection(selectionOp, filter);
               if (ssRes.Status == PromptStatus.OK)
               {
                   SelectionSet SS = ssRes.Value;
                   int nCount = SS.Count;
                   ed.WriteMessage("ѡ����{0}����"  , nCount);
               }
        }
Пример #34
0
 public void AddLinesToGroup()
 {
     Editor editor = dwg.Editor;
     using (Transaction acadTrans = CurrentDatabase.TransactionManager.StartTransaction())
     {
         GroupsInformation groupsEntities = new GroupsInformation(acadTrans, CurrentDatabase);
         //Спрашиваем имя группы
         string GroupName = AskForGroup(true, groupsEntities.GroupList);
         if (GroupName != null)
         {
             // Готовим опции для запроса элементов группы
             PromptSelectionOptions acadSelectionOptions = new PromptSelectionOptions();
             acadSelectionOptions.MessageForAdding = "\nУкажите объекты группы " + GroupName;
             //Выделять будем только линии и полилинии. Создаем фильтр
             TypedValue[] acadFilterValues = new TypedValue[4];
             acadFilterValues.SetValue(new TypedValue((int)DxfCode.Operator, "<OR"),0);
             acadFilterValues.SetValue(new TypedValue((int)DxfCode.Start, "LINE"),1);
             acadFilterValues.SetValue(new TypedValue((int)DxfCode.Start, "LWPOLYLINE"),2);
             acadFilterValues.SetValue(new TypedValue((int)DxfCode.Operator, "OR>"),3);
             SelectionFilter acadSelFilter = new SelectionFilter(acadFilterValues);
             //Используем фильтр для выделения
             PromptSelectionResult acadSelSetPrompt = dwg.Editor.GetSelection(acadSelectionOptions, acadSelFilter);
             //Если выбраны объекты - едем дальше
             if (acadSelSetPrompt.Status == PromptStatus.OK)
             {
                 // Формируем коллекцию выделенных объектов
                 SelectionSet acadSelectedObjects = acadSelSetPrompt.Value;
                 // Проходим по каждому объекту в выделении
                 foreach (SelectedObject selectedObj in acadSelectedObjects)
                 {
                     if (selectedObj!=null)
                     {
                         groupsEntities.AppendGroupToObject(selectedObj.ObjectId, GroupName);
                     }
                 }
             }
         }
         acadTrans.Commit();
     }
 }
Пример #35
0
        public static decimal[] CommandAcVol() // Выбор объектов и возврат массива объемов согласно списку слоев в listBoxLayers
        {
            try
            {
                Document acDoc = Application.DocumentManager.MdiActiveDocument; //Текущий документ.
                Editor acDocEd = acDoc.Editor; // Editor текущего документа.
                Database acDocDb = acDoc.Database; // Database текущего документа.

                //int layersCount = _form.listBoxLayers.Items.Count;
                decimal[] decVolumesArray = new decimal[_form.listBoxLayers.Items.Count];

                using (acDoc.LockDocument()) // блокировка документа
                {
                    using (Transaction acTrans = acDocDb.TransactionManager.StartTransaction()) // Начало Транзакции.
                    {

                        // Создание TypedValue array для определение параметров фильтра.
                        var acTypedValueArray = new TypedValue[2];
                        acTypedValueArray.SetValue(new TypedValue((int)DxfCode.Start, "*POLYLINE"), 0); // Параметр фильтра под номером 0.
                        acTypedValueArray.SetValue(new TypedValue((int)DxfCode.LayerName, "acVlm_*"), 1); // Параметр фильтра под номером 1.
                        // Assign the filter criteria to a SelectionFilter object
                        var acSelectionFilterObject = new SelectionFilter(acTypedValueArray);

                        // Задание опций выбора объектов.
                        var acSelectionSetOptions = new PromptSelectionOptions
                        {
                            AllowDuplicates = false,
                            RejectObjectsOnLockedLayers = true,
                            MessageForAdding = "Выберите контуры для подсчета объемов:"
                        };


                        var acSelectionSetPrompt = acDocEd.GetSelection(acSelectionSetOptions, acSelectionFilterObject);

                        if (acSelectionSetPrompt.Status == PromptStatus.OK)
                        {
                            var acSelectionSet = acSelectionSetPrompt.Value;
                            //int polylineCount = 0;

                            double sclFactor = 0.0;
                            switch (_form.comboBoxScale.SelectedIndex)
                            {
                                case 0:
                                    sclFactor = 10.0;
                                    break;
                                case 1:
                                    sclFactor = 5.0;
                                    break;
                            }

                            foreach (SelectedObject acSelectedObject in acSelectionSet)
                            {
                                if (acSelectedObject != null)
                                {
                                    var acEnt = acTrans.GetObject(acSelectedObject.ObjectId, OpenMode.ForWrite) as Entity;

                                    if (acEnt != null)
                                    {
                                        var acPolyLine = (Polyline)acEnt;
                                        for (int layerNumber = 0; layerNumber < _form.listBoxLayers.Items.Count; layerNumber++)
                                        {

                                            string layerPostfix = "";
                                            switch ((string)_form.listBoxLayersUnits.Items[layerNumber])
                                            {
                                                case "м2":
                                                    layerPostfix = "_msrA";
                                                    break;
                                                case "м":
                                                    layerPostfix = "_msrL";
                                                    break;
                                            }

                                            if (acPolyLine.Layer == "acVlm_" + _form.listBoxLayers.Items[layerNumber] + layerPostfix)
                                            {
                                                if ((string)_form.listBoxLayersUnits.Items[layerNumber] == "м2")
                                                {
                                                    decVolumesArray[layerNumber] = decVolumesArray[layerNumber] + (decimal)(acPolyLine.Area / (sclFactor * sclFactor));
                                                }
                                                if ((string)_form.listBoxLayersUnits.Items[layerNumber] == "м")
                                                {
                                                    decVolumesArray[layerNumber] = decVolumesArray[layerNumber] + (decimal)(acPolyLine.Length / sclFactor);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }

                        else
                        {
                            acTrans.Abort();
                            AcVolShowForm();
                            return null;
                        }
                        acTrans.Commit();
                        return decVolumesArray;
                    }
                }
            }

            catch (NullReferenceException)
            {
                return null;
            }
        }
Пример #36
0
 public void ChangeGroupOfLines()
 {
     Editor editor = dwg.Editor;
     PromptSelectionResult selectionResult = editor.SelectImplied();
     List<string> groupList = new List<string>();
     if (selectionResult.Status != PromptStatus.OK)
     {
         PromptSelectionOptions selectionOptions = new PromptSelectionOptions();
         selectionOptions.MessageForAdding = "\nУкажите объекты";
         selectionResult = editor.GetSelection(selectionOptions);
     }
     if (selectionResult.Status == PromptStatus.OK)
     {
         using (Transaction transaction = CurrentDatabase.TransactionManager.StartTransaction())
         {
             SelectionSet selectionSet = selectionResult.Value;
             GroupsInformation groupEntities = new GroupsInformation(transaction, CurrentDatabase);
             foreach (SelectedObject selectedObject in selectionSet)
             {
                 foreach (string group in groupEntities.GetGroupsOfObject(selectedObject.ObjectId))
                 {
                     if (!groupList.Contains(group))
                     {
                         groupList.Add(group);
                     }
                 }
             }
             groupList.Sort();
             string previousName = AskForGroup(false, groupList);
             if (previousName!=null)
             {
                 string newName = AskForGroup(true, groupEntities.GroupList);
                 if (newName!=null)
                 {
                     foreach (SelectedObject selectedObject in selectionSet)
                     {
                         groupEntities.RenameGroupOfObject(selectedObject.ObjectId, previousName, newName);
                     }
                 }
             }
             transaction.Commit();
         }
     }
 }
Пример #37
0
        public void CommandDeleteRecord()
        {
            try
            {
                Tables tables = HostMapApplicationServices.Application.ActiveProject.ODTables;

                if (!this.IsTableExisted(tables, m_tableName))
                {
                    AcadEditor.WriteMessage("\n 没有创建对象数据表。");
                    return;
                }

                PromptSelectionOptions options = new PromptSelectionOptions();

                // 选择实体
                options.SingleOnly = true;
                options.SinglePickInSpace = true;
                options.MessageForAdding = "选择附着了对象数据的实体:";
                PromptSelectionResult result = AcadEditor.GetSelection(options);

                if (result.Status != PromptStatus.OK)
                {
                    AcadEditor.WriteMessage("\n 用户取消! ");
                    return;
                }

                ObjectId[] ids = result.Value.GetObjectIds();
                if (ids.Length != 1)
                {
                    AcadEditor.WriteMessage("\n 无效的选择! ");
                    return;
                }

                ShowObjectDataInfo(tables, ids[0]);

                PromptIntegerResult resultInt =
                    AcadEditor.GetInteger("\n 输入要删除的记录的索引 ");

                if (resultInt.Status != PromptStatus.OK)
                {
                    AcadEditor.WriteMessage("\n  用户取消! ");
                    return;
                }

                using (Records records = tables.GetObjectRecords(0, ids[0], Autodesk.Gis.Map.Constants.OpenMode.OpenForWrite, false))
                {
                    int deleteIndex = resultInt.Value;
                    if (deleteIndex < 0 || deleteIndex >= records.Count)
                    {
                        AcadEditor.WriteMessage("\n 无效的索引! ");
                        return;
                    }

                    IEnumerator ie = records.GetEnumerator();
                    ie.Reset();

                    int index = 0;
                    while (index <= deleteIndex)
                    {
                        ie.MoveNext();
                        index++;
                    }

                    try
                    {
                        // 移除记录
                        records.RemoveRecord();
                    }
                    catch (MapException e)
                    {
                        AcadEditor.WriteMessage(e.Message);
                    }
                }

                ShowObjectDataInfo(tables, ids[0]);
            }
            catch (System.Exception err)
            {
                AcadEditor.WriteMessage(err.Message);
            }
        }
Пример #38
0
        public string SelectConduits()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;

            //TODO: add selection filter for typeof(Conduit)

            try
            {
                PromptSelectionOptions selOpts = new PromptSelectionOptions();

                selOpts.MessageForAdding = "\nSelect Conduits: ";

                PromptSelectionResult psr;
                psr = ed.GetSelection(selOpts);

                // Grab object Ids and go through one by one
                Transaction tr = doc.TransactionManager.StartTransaction();
                using (tr)
                {
                    try
                    {
                        List<string> partSizes = new List<string>();
                        int total = 0;
                        ObjectId[] objIds = psr.Value.GetObjectIds();

                        //Loop through the selected objectIds
                        foreach (ObjectId objId in objIds)
                        {

                            Entity ent = (Entity)tr.GetObject(objId, OpenMode.ForRead); //use entity as object type to find
                            Member mem = tr.GetObject(objId, OpenMode.ForRead) as Member;   //set as member (needed to process AEC)

                            // Checks to make sure that ObjectId can be pulled as a Member, if not, then discards object from selection,
                            // Then checks to make sure Member is ofType 'Conduit' or else discards.
                            if (mem != null && mem.ToString() == "Autodesk.Aec.Building.Elec.DatabaseServices.Conduit")
                            {
                                partSizes.Add(GetPartSize(mem));
                                total++;
                            }
                            else
                            {
                                continue;
                            }
                        }

                        //Count each occurance of each distinct conduit and return in nice formatted text.

                        /* Have no clue how this works, but it works! */
                        var query = from x in partSizes
                                    group x by x into g
                                    let count = g.Count()
                                    orderby count descending
                                    select new { Name = g.Key, Count = count };

                        string res = "";

                        foreach (var result in query)
                        {
                            res += "\n(" + result.Count + ")  " + result.Name;
                        }
                        /**/

                        //Ugly way to remove starting new-line, but hey, it works.
                        res = res.TrimStart('\n');

                        //Return result as nice string block.
                        tr.Commit();
                        return res;
                    }
                    catch (NullReferenceException)
                    {
                        tr.Abort();
                        return "FAIL";
                    }
                    catch (SystemException ex)
                    {

                        //Sends system exception, but only for Debugging
                        //ed.WriteMessage("secondary catch:: Error: {0}", ex.ToString());
                        tr.Abort();
                        return "FAIL";
                    }
                }
            }
            catch (SystemException ex)
            {

                //ed.WriteMessage("Error: {0}", ex.ToString());
                //ed.WriteMessage("main catch:: Error: {0}", ex.ToString());
                return "FAIL";
            }
        }

        [CommandMethod("SETMLEADERLAYER")]
        public void SetMLeaderLayer()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            PromptStringOptions pso = new PromptStringOptions("\nEnter new default layer for ConduitQuantityTable Mleader: ");

            PromptResult pr = ed.GetString(pso);

            if (pr.Status == PromptStatus.OK)
            {
                string pResult = pr.StringResult;

                if (pResult == "" || pResult == null)
                {
                    ed.WriteMessage("\nMust not be blank");
                }
                else
                {
                    if (LayerExists(pResult) == false)
                    {
                        pResult = pResult.ToUpper();
                        CreateLayer(pResult);   //create New layer
                        _mlLayer = pResult;     //set the layer to default.
                        ed.WriteMessage("\nNew default layer set to: {0}", pResult);
                    }
                    else if (LayerExists(pResult) == true)
                    {
                        _mlLayer = pResult;
                        ed.WriteMessage("\nNew default layer set to: {0}", pResult);
                    }
                    else
                    {
                        ed.WriteMessage("\nSomething went terribly wrong.");
                    }
                }

            }
        }

        private void CreateLayer(string pResult)
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            //Open layertable for write
            Transaction tr = db.TransactionManager.StartTransaction();
            using (tr)
            {
                LayerTable lt = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForWrite);

                try
                {
                    LayerTableRecord ltr = new LayerTableRecord();
                    //set props
                    ltr.Name = pResult;
                    ltr.Color = Color.FromColorIndex(ColorMethod.ByAci, 0);
                    //add to table
                    ObjectId ltId = lt.Add(ltr);
                    tr.AddNewlyCreatedDBObject(ltr, true);

                    tr.Commit();
                }
                catch (System.Exception)
                {
                    ed.WriteMessage("ERROR Creating layer...");
                    tr.Abort();
                }
            }
        }

        private string GetPartSize(Member mem)
        {
            DataRecord dr = PartManager.GetPartData(mem); //Pulls the part from the object as a datarecord
            DataField df = dr.FindByContextAndIndex(Context.CatalogPartSizeName, 0);    //Searches through MEP catalog for part name.
            string partSizeName = df.ValueString;

            //Remove trailing end leaving only number.
            //partSizeName = partSizeName.Remove(7);

            return partSizeName;
        }

        private bool LayerExists(string pResult)
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            Transaction tr = db.TransactionManager.StartTransaction();
            using (tr)
            {
                //Open layertable for read
                LayerTable lt = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead);

                //Check layer table against input to see if match
                try
                {
                    if (lt.Has(pResult))
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                    tr.Commit();
                }
                catch (System.Exception)
                {
                    tr.Abort();
                    ed.WriteMessage("ERROR:!!!");
                    return false;
                }
            }
        }

        #endregion Methods

        #region Nested Types

        class MLeaderJig : EntityJig
        {
            #region Fields

            string m_contents;
            int m_leaderIndex;
            int m_leaderLineIndex;
            Point3dCollection m_pts;
            Point3d m_tempPoint;

            #endregion Fields

            #region Constructors

            public MLeaderJig(string contents)
                : base(new MLeader())
            {
                // Store the string passed in

                m_contents = contents;

                // Create a point collection to store our vertices

                m_pts = new Point3dCollection();

                // Create mleader and set defaults

                MLeader ml = Entity as MLeader;
                ml.SetDatabaseDefaults();
                ml.EnableLanding = true;
                ml.Annotative = AnnotativeStates.True;
                ml.ExtendLeaderToText = true;

                // Set up the MText contents

                ml.ContentType = Autodesk.AutoCAD.DatabaseServices.ContentType.MTextContent;
                MText mt = new MText();
                mt.SetDatabaseDefaults();
                mt.Contents = m_contents;
                mt.Annotative = AnnotativeStates.True;
                mt.TextHeight = 9.0;
                ml.MText = mt;
                ml.TextAlignmentType = TextAlignmentType.LeftAlignment;
                ml.TextAttachmentType = TextAttachmentType.AttachmentMiddle;

                //Set the layer
                ml.Layer = _mlLayer;

                // Set the frame and landing properties
                /*
                ml.EnableDogleg = true;
                ml.EnableFrameText = true;
                ml.EnableLanding = true;
                */

                // TODO: Test, Reduce the standard landing gap
                //ml.LandingGap = 0.05;

                // Add a leader, but not a leader line (for now)

                m_leaderIndex = ml.AddLeader();
                m_leaderLineIndex = -1;
            }

            #endregion Constructors

            #region Methods

            public void AddVertex()
            {
                MLeader ml = Entity as MLeader;

                // For the first point...

                if (m_pts.Count == 0)
                {
                    // Add a leader line

                    m_leaderLineIndex = ml.AddLeaderLine(m_leaderIndex);

                    // And a start vertex

                    ml.AddFirstVertex(m_leaderLineIndex, m_tempPoint);

                    // Add a second vertex that will be set
                    // within the jig

                    ml.AddLastVertex(m_leaderLineIndex, new Point3d(0, 0, 0));
                }
                else
                {
                    // For subsequent points,
                    // just add a vertex

                    ml.AddLastVertex(m_leaderLineIndex, m_tempPoint);
                }

                // Reset the attachment point, otherwise
                // it seems to get forgotten

                ml.TextAttachmentType = TextAttachmentType.AttachmentMiddle;

                // Add the latest point to our history

                m_pts.Add(m_tempPoint);
            }
Пример #39
0
        public void CommandShowRecords()
        {
            try
            {
                Tables tables = HostMapApplicationServices.Application.ActiveProject.ODTables;

                if (!this.IsTableExisted(tables, m_tableName))
                {
                    AcadEditor.WriteMessage("\n 没有创建对象数据表。");
                    return;
                }

                PromptSelectionOptions options = new PromptSelectionOptions();

                // 选择实体
                options.SingleOnly = true;
                options.SinglePickInSpace = true;
                options.MessageForAdding = "选择附着了对象数据的实体:";
                PromptSelectionResult result = AcadEditor.GetSelection(options);

                if (result.Status != PromptStatus.OK)
                {
                    AcadEditor.WriteMessage("\n 用户取消! ");
                    return;
                }

                ObjectId[] ids = result.Value.GetObjectIds();
                if (ids.Length != 1)
                {
                    AcadEditor.WriteMessage("\n 无效的选择! ");
                    return;
                }

                if (!ShowObjectDataInfo(tables, ids[0]))
                {
                    AcadEditor.WriteMessage("\n 访问对象数据失败. ");
                }
            }
            catch (System.Exception err)
            {
                AcadEditor.WriteMessage(err.Message);
            }
        }
Пример #40
0
        public static void SelectTables(string msg)
        {
            Document acDoc = Application.DocumentManager.MdiActiveDocument; //Текущий документ.
            Editor acDocEd = acDoc.Editor; // Editor текущего документа.
            Database acDocDb = acDoc.Database; // Database текущего документа.

            Dictionary<string, string> globalVolumesNamesAndUnits = new Dictionary<string, string>(); //Наименования объемов и единиц измерения
            Dictionary<double, ObjectId> globalPKsAndObjectIds = new Dictionary<double, ObjectId>(); //ПК для подсчета объемов и соответвующие им идентификаторы определений блоков с таблицами

            using (acDoc.LockDocument()) // блокировка документа
            {
                using (Transaction acTrans = acDocDb.TransactionManager.StartTransaction()) // Начало Транзакции.
                {
                    //открываем таблицу блоков чертежа для чтения
                    BlockTable acDocDbBlockTable = (BlockTable)acTrans.GetObject(acDocDb.BlockTableId, OpenMode.ForRead);

                    // Создание TypedValue array для определение параметров фильтра.
                    var acTypedValueArray = new TypedValue[2];
                    acTypedValueArray.SetValue(new TypedValue((int)DxfCode.Start, "INSERT"), 0); // Параметр фильтра под номером 0.
                    acTypedValueArray.SetValue(new TypedValue((int)DxfCode.LayerName, "acVlm_*"), 1); // Параметр фильтра под номером 1.

                    // Assign the filter criteria to a SelectionFilter object
                    var acSelectionFilterObject = new SelectionFilter(acTypedValueArray);

                    // Задание опций выбора объектов.
                    var acSelectionSetOptions = new PromptSelectionOptions
                    {
                        AllowDuplicates = false,
                        RejectObjectsOnLockedLayers = true,
                        //SingleOnly = true,
                        MessageForAdding = msg
                    };

                    // Выбор объектов
                    var acSelectionSetPrompt = acDocEd.GetSelection(acSelectionSetOptions, acSelectionFilterObject);

                    if (acSelectionSetPrompt.Status == PromptStatus.OK)
                    {
                        var acSelectionSet = acSelectionSetPrompt.Value;
                        //MessageBox.Show("Количество выбранных объектов = " + acSelectionSet.Count.ToString(), myCommands.msgBoxCaption_acVolume);
                        // ReSharper disable once LoopCanBeConvertedToQuery

                        //Перебираем объекты и определяем количество наименований объемов, а так же количество пикетов для посчета объемов

                        foreach (SelectedObject acSelectedObject in acSelectionSet)
                        {
                            if (acSelectedObject != null)
                            {
                                Entity acEnt = acTrans.GetObject(acSelectedObject.ObjectId, OpenMode.ForWrite) as Entity;

                                if (acEnt != null)
                                {
                                    BlockReference objBlockReference = (BlockReference)acEnt;
                                    if (objBlockReference.Layer.Contains("acVlm_")) // проверяем, принадлежит ли выбранный блок к нужному слою
                                    {
                                        ObjectId btrObjectId = acDocDbBlockTable[objBlockReference.Name]; //получаем ObjectId определения блока по имени его вхождения (objBlockReference.Name)
                                        BlockTableRecord objBlockTableRecord = (BlockTableRecord)btrObjectId.GetObject(OpenMode.ForRead); //Конвертируем объект в определние блока objBlockTableRecord

                                        //определяем количество таблиц с валидными пикетами
                                        foreach (ObjectId objObjectId in objBlockReference.AttributeCollection) //для каждого объекта в коллекции атрибутов objBlockReference.AttributeCollection
                                        {
                                            AttributeReference objAttributeReference = (AttributeReference)acTrans.GetObject(objObjectId, OpenMode.ForRead); //конвертируем объект в AttributeReference
                                            if (objAttributeReference != null)
                                            {
                                                if (objAttributeReference.Tag == "ПК" & ConvertStringToDouble(objAttributeReference.TextString) >= 0) // для каждого атрибута с Тэгом="ПК" и значением >= 0
                                                {
                                                    if (!globalPKsAndObjectIds.ContainsKey(ConvertStringToDouble(objAttributeReference.TextString.Trim())))
                                                    {
                                                        globalPKsAndObjectIds.Add(ConvertStringToDouble(objAttributeReference.TextString.Trim()), btrObjectId);
                                                    }
                                                    else
                                                    {
                                                        MessageBox.Show(
                                                            "Обнаружены таблицы объемов с одиниковым значением ПК.\nВозможны ошибки в подсчете объемов.\nУдалите дублирующиеся таблицы.",
                                                            "acVolume", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                                                    }
                                                    //MessageBox.Show("BlockReference.Name: " + objBlockReference.Name + "\nПК = " + objAttributeReference.TextString);
                                                }
                                            }
                                        }

                                        foreach (ObjectId objObjectIdInBtr in objBlockTableRecord) //перебираем объекты в определении блока
                                        {
                                            try //ловим таблицу
                                            {
                                                Table objTable = (Table)objObjectIdInBtr.GetObject(OpenMode.ForRead);
                                                for (int rowIndex = 1; rowIndex < objTable.Rows.Count; rowIndex++)
                                                {
                                                    string volumeName = objTable.Cells[rowIndex, 0].TextString.Trim();
                                                    string volumeUnit = objTable.Cells[rowIndex, 1].TextString.Trim();

                                                    if (!globalVolumesNamesAndUnits.ContainsKey(volumeName))
                                                    {
                                                        globalVolumesNamesAndUnits.Add(volumeName, volumeUnit);
                                                    }
                                                }
                                                //MessageBox.Show(objTable.Cells[0, 0].TextString);
                                            }
                                            catch
                                            { //throw;
                                            }

                                            //try //ловим атрибут
                                            //{
                                            //    AttributeDefinition objAttributeDefinition = (AttributeDefinition)objObjectIdInBTR.GetObject(OpenMode.ForRead);
                                            //    //MessageBox.Show(objAttributeDefinition.Tag);
                                            //}
                                            //catch
                                            //{ //throw; 
                                            //}
                                        }
                                    }
                                }
                            }
                        }
                        // определяем количество строк и столбцов в string[,] globalVolumesTable - будующей попикетной ведомости
                        int globalRowCount = 2 + (globalPKsAndObjectIds.Count - 1) * 2 + 1 + 1; // Заголовок + (Количество ПК - 1)*2 + строка с последним ПК + строка суммы
                        int globalColumnCount = 2 + globalVolumesNamesAndUnits.Count * 2; // (столбцы ПК и Длина участка) + столбцы собъемами * 2
                        string[,] globalVolumesTable = new string[globalRowCount, globalColumnCount];

                        //Заполняем заголовки и ПК в string[,] globalVolumesTable - будующей попикетной ведомости
                        globalVolumesTable[0, 0] = "ПК+";
                        globalVolumesTable[0, 1] = "Длина участка, м";
                        globalVolumesTable[globalRowCount - 1, 0] = "ВСЕГО:";
                        //Заполняем наименования объемов и единицы измерения
                        for (int i = 0; i < globalVolumesNamesAndUnits.Count; i++)
                        {
                            globalVolumesTable[0, 2 + i * 2] = globalVolumesNamesAndUnits.ElementAt(i).Key;
                            globalVolumesTable[1, 2 + i * 2] = globalVolumesNamesAndUnits.ElementAt(i).Value;
                            switch (globalVolumesNamesAndUnits.ElementAt(i).Value)
                            {
                                case "м":
                                    globalVolumesTable[1, 2 + i * 2 + 1] = "м2";
                                    break;

                                case "м2":
                                    globalVolumesTable[1, 2 + i * 2 + 1] = "м3";
                                    break;
                            }
                        }
                        //Сортируем ПК в порядке убывания
                        globalPKsAndObjectIds = globalPKsAndObjectIds.OrderBy(pair => pair.Key).ToDictionary(pair => pair.Key, pair => pair.Value);
                        // Заполняем пикеты
                        for (int i = 0; i < globalPKsAndObjectIds.Count; i++)
                        {
                            globalVolumesTable[2 + i * 2, 0] = Convert.ToString(Math.Round(globalPKsAndObjectIds.ElementAt(i).Key, 2), CultureInfo.InvariantCulture);
                        }

                        //Получаем из Dictionary globalVolumesNamesAndUnits список List<string> globalVolumesNames
                        List<string> globalVolumesNames = globalVolumesNamesAndUnits.Select(itm => itm.Key).ToList();
                        //List<double> globalPKs = globalPKsAndObjectIds.Select(itm => itm.Key).ToList();
                        List<ObjectId> globalObjectIds = globalPKsAndObjectIds.Select(itm => itm.Value).ToList();

                        //Перебираем таблицы и добавляем объемы в string[,] globalVolumesTable
                        for (int i = 0; i < globalPKsAndObjectIds.Count; i++)
                        {
                            ObjectId btrObjectId = globalPKsAndObjectIds.ElementAt(i).Value; //получаем ObjectId
                            BlockTableRecord objBlockTableRecord =
                                (BlockTableRecord)btrObjectId.GetObject(OpenMode.ForRead);
                            //Конвертируем объект в определние блока objBlockTableRecord
                            foreach (ObjectId objObjectIdInBtr in objBlockTableRecord) //перебираем объекты в определении блока
                            {
                                try //ловим таблицу
                                {
                                    Table objTable = (Table)objObjectIdInBtr.GetObject(OpenMode.ForRead);
                                    for (int rowIndex = 1; rowIndex < objTable.Rows.Count; rowIndex++)
                                    {
                                        string volumeName = objTable.Cells[rowIndex, 0].TextString.Trim();
                                        if (globalVolumesNames.Contains(volumeName) & globalPKsAndObjectIds.ContainsValue(btrObjectId))
                                        {
                                            int volumeColumn = 2 + globalVolumesNames.IndexOf(volumeName) * 2;
                                            int volumeRow = 2 + globalObjectIds.IndexOf(btrObjectId) * 2;
                                            globalVolumesTable[volumeRow, volumeColumn] = objTable.Cells[rowIndex, 2].Value.ToString();
                                        }
                                    }
                                    //MessageBox.Show(objTable.Cells[0, 0].TextString);
                                }
                                catch
                                {
                                    // ignored }
                                }
                            }
                        }

                        //считаем расстояния для предпросмотра в DataGrid

                        for (int rowIndex = 3; rowIndex < globalVolumesTable.GetLength(0) - 2; rowIndex = rowIndex + 2)
                        {
                            double nextItem = ConvertStringToDouble(globalVolumesTable[rowIndex + 1, 0]);
                            double previousItem = ConvertStringToDouble(globalVolumesTable[rowIndex - 1, 0]);
                            double lengthItem = nextItem - previousItem;
                            globalVolumesTable[rowIndex, 1] = Convert.ToString(Math.Round(lengthItem, 2), CultureInfo.InvariantCulture);
                        }

                        //считаем объемы между поперечниками для предпросмотра в DataGrid

                        for (int columnIndex = 3; columnIndex < globalVolumesTable.GetLength(1); columnIndex = columnIndex + 2)
                        {
                            for (int rowIndex = 3; rowIndex < globalVolumesTable.GetLength(0) - 2; rowIndex = rowIndex + 2)
                            {
                                double nextItem = ConvertStringToDouble(globalVolumesTable[rowIndex + 1, columnIndex - 1]);
                                double previousItem = ConvertStringToDouble(globalVolumesTable[rowIndex - 1, columnIndex - 1]);
                                double volume = (nextItem + previousItem) / 2.0d * ConvertStringToDouble(globalVolumesTable[rowIndex, 1]);
                                globalVolumesTable[rowIndex, columnIndex] = Convert.ToString(Math.Round(volume, 2), CultureInfo.InvariantCulture);
                            }
                        }

                        //считаем итоги
                        for (int columnIndex = 3; columnIndex < globalVolumesTable.GetLength(1); columnIndex = columnIndex + 2)
                        {
                            double columnVolume = 0.0d;
                            for (int rowIndex = 3; rowIndex < globalVolumesTable.GetLength(0) - 2; rowIndex = rowIndex + 2)
                            {
                                columnVolume = columnVolume + ConvertStringToDouble(globalVolumesTable[rowIndex, columnIndex]);
                            }
                            globalVolumesTable[globalVolumesTable.GetLength(0) - 1, columnIndex] = Convert.ToString(Math.Round(columnVolume, 2), CultureInfo.InvariantCulture);
                        }

                        //Отладочные сообщения
                        //MessageBox.Show("Выбрано блоков " + acSelectionSet.Count + ".\nИз них таблиц с пикетажем " + globalPKsAndObjectIds.Count);
                        //string str1 = "Перечень ПК и ObjectIds:\n";
                        //for (int i = 0; i < globalPKsAndObjectIds.Count; i++)
                        //{
                        //    str1 = str1 + "ПК " + globalPKsAndObjectIds.ElementAt(i).Key + ", " + "ObjectId: " + globalPKsAndObjectIds.ElementAt(i).Value + "\r";
                        //}
                        //MessageBox.Show(str1);
                        //string str = "Перечень наименований объемов:\n";
                        //for (int i = 0; i < globalVolumesNamesAndUnits.Count; i++)
                        //{
                        //    str = str + globalVolumesNamesAndUnits.ElementAt(i).Key + ", " + globalVolumesNamesAndUnits.ElementAt(i).Value + "\r";
                        //}
                        //MessageBox.Show(str);

                        //AcVolShowGlobalvolumesForm();

                        //Заполнение DataGrid
                        //DataGridFilling(globalVolumesTable, _globalVolumesForm.dataGridView1);

                        //Экспорт в Excel
                        ExportToExcel(globalVolumesTable);
                        
                    }
                    acTrans.Commit();
                }
            }
            AcVolShowForm();
        }
Пример #41
0
        private static string SelectPk(string msg) //Указание ПК поперечного профиля
        {
            DBText acDbText = new DBText();

            Document acDoc = Application.DocumentManager.MdiActiveDocument; //Текущий документ.
            Editor acDocEd = acDoc.Editor; // Editor текущего документа.
            Database acDocDb = acDoc.Database; // Database текущего документа.

            using (Transaction acTrans = acDocDb.TransactionManager.StartTransaction()) // Начало Транзакции.
            {
            ReturnIfNullOrEmpty:
                
                // Создание TypedValue array для определение параметров фильтра.
                var acTypedValueArray = new TypedValue[1];
                acTypedValueArray.SetValue(new TypedValue((int)DxfCode.Start, "TEXT"), 0); // Параметр фильтра под номером 0.
                
                // Assign the filter criteria to a SelectionFilter object
                var acSelectionFilterObject = new SelectionFilter(acTypedValueArray);

                // Задание опций выбора объектов.
                var acSelectionSetOptions = new PromptSelectionOptions
                {
                    AllowDuplicates = false,
                    RejectObjectsOnLockedLayers = true,
                    SingleOnly = true,
                    MessageForAdding = msg
                };



                // Выбор объектов
                var acSelectionSetPrompt = acDocEd.GetSelection(acSelectionSetOptions, acSelectionFilterObject);

                if (acSelectionSetPrompt.Status == PromptStatus.OK)
                {
                    var acSelectionSet = acSelectionSetPrompt.Value;
                    foreach (SelectedObject acSelectedObject in acSelectionSet)
                    {
                        if (acSelectedObject != null)
                        {
                            var acEnt = acTrans.GetObject(acSelectedObject.ObjectId, OpenMode.ForWrite) as Entity;

                            if (acEnt != null)
                            {
                                acDbText = (DBText)acEnt;
                            }
                        }
                    }
                }

                if (acSelectionSetPrompt.Status == PromptStatus.Error)
                {
                     MessageBox.Show("ПК не выбран, повторите попытку!", myCommands.msgBoxCaption_acVolume, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                     goto ReturnIfNullOrEmpty;
                }

                if (acSelectionSetPrompt.Status == PromptStatus.Cancel)
                {
                    //MessageBox.Show("Статус Cancel");
                    //MessageBox.Show("Выбор пикета отменен!\nТаблица объемов не будет привязана к пикету и не будет учитываться при экспорте объемов в Excel.", "acVolume", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    acTrans.Commit();
                    return "-1";
                }
                acTrans.Commit();
            }

            //MessageBox.Show("acDBText = " + acDBText.TextString.Trim());
            return acDbText.TextString.Trim();
        }
Пример #42
0
 public void List()
 {
     Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
     try
     {
         PromptSelectionOptions Opts = new PromptSelectionOptions();
         TypedValue[] filList = new TypedValue[1];
         //Build a filter list so that only block references are selected
         filList[0] = new TypedValue((int)DxfCode.Start, "INSERT");
         SelectionFilter filter = new SelectionFilter(filList);
         PromptSelectionResult res = ed.GetSelection(Opts, filter);
         //Do nothing if selection is unsuccessful
         if (res.Status != PromptStatus.OK)
             return;
         Autodesk.AutoCAD.EditorInput.SelectionSet SS = res.Value;
         ObjectId[] idArray;
         idArray = SS.GetObjectIds();
         string[] saEmployeeList = new string[4];
         //collect all employee details in saEmployeeList array
         foreach (ObjectId employeeId in idArray)
         {
             ListEmployee(employeeId, ref saEmployeeList);
             //Print employee details to the command line
             foreach (string employeeDetail in saEmployeeList)
             {
                 ed.WriteMessage(employeeDetail);
             }
             //separator
             ed.WriteMessage("----------------------" + "\r\n");
         }
     }
     catch (System.Exception ex)
     {
         ed.WriteMessage("Error Listing Employees: " + ex.Message);
     }
 }
Пример #43
0
 // запрос выбора объектов этажа
 private List<ObjectId> selectFloor(string indexFloor)
 {
     var selOpt = new PromptSelectionOptions();
     selOpt.MessageForAdding = $"\nВыбор объектов {_planTypeName} плана {indexFloor} этажа";
     var selRes = _ed.GetSelection(selOpt);
     if (selRes.Status == PromptStatus.OK)
     {
         return selRes.Value.GetObjectIds().ToList();
     }
     else
     {
         throw new Exception("Отменено пользователем.");
     }
 }
Пример #44
0
 public static IAcedCmdArg Argument(PromptSelectionOptions options)
 {
     return new PromptSelectionArgument(options);
 }
Пример #45
0
        public void aa()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;

            //setting the settings for the selection filter - we want only lines filtered
            TypedValue[] acTypeValAr = new TypedValue[1]
                                {
                                    new TypedValue((int)DxfCode.Start , "Line")
                                };

            // instantiating the selection filter and getting the selection result
            SelectionFilter sf = new SelectionFilter(acTypeValAr);
            PromptSelectionOptions psoAngledLines = new PromptSelectionOptions();
            psoAngledLines.MessageForAdding = "Please select rough area where angled lines exist";
            PromptSelectionResult psrAngledLines = ed.GetSelection(psoAngledLines, sf);

            //if the lines are above a certain angle then put it into an objectIDCollect
            if (psrAngledLines.Status == PromptStatus.OK)
            {

                using (Transaction tr = db.TransactionManager.StartTransaction() )
                {
                    ObjectIdCollection filteredLines = new ObjectIdCollection();
                    BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                    BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;

                    foreach (SelectedObject so in psrAngledLines.Value)
                    {
                        Line ln = tr.GetObject(so.ObjectId, OpenMode.ForWrite) as Line;
                                if (ln != null)
                                {

                                    try
                                    {
                                        //if it's a small line then delete asap.
                                        if (ln.Length < 0.2)
                                        { ln.Erase(true); }
                                        else
                                        {
                                                    {
                                                        if      ((ln.Angle < (((Math.PI) / 4) + ((Math.PI) / 12)) && ln.Angle > (((Math.PI) / 4) - ((Math.PI) / 12))) ||
                                                                (ln.Angle < (((Math.PI) * 3 / 4) + ((Math.PI) / 12)) && ln.Angle > (((Math.PI) * 3 / 4) - ((Math.PI) / 12))) ||
                                                                (ln.Angle < (((Math.PI) * 5 / 4) + ((Math.PI) / 12)) && ln.Angle > (((Math.PI) * 5 / 4) - ((Math.PI) / 12))) ||
                                                                (ln.Angle < (((Math.PI) * 7 / 4) + ((Math.PI) / 12)) && ln.Angle > (((Math.PI) * 7 / 4) - ((Math.PI) / 12))))
                                                                // if it meets those conditions then erase
                                                        {
                                                            filteredLines.Add(ln.ObjectId);
                                                            ln.Erase(true);
                                                        }
                                                    } //end else statement
                                         } //if erased
                                        }
                                        catch
                                        {
                                            doc.Editor.WriteMessage("\nLine already deleted, or perhaps some other type of error") ;
                                        }
                                }//end if ln!= null
                    }//end foreach
                        tr.Commit();
                }//end using transaction

                TypedValue[] acTypeValAr1 = new TypedValue[2]
                                {
                                    new TypedValue((int)DxfCode.Start , "MTEXT"),
                                    new TypedValue((int)DxfCode.Text , "*"),
                                };

                SelectionFilter sf1 = new SelectionFilter(acTypeValAr1);

                psoAngledLines.MessageForAdding = "Please select rough area where angled lines exist";
                psrAngledLines = ed.GetSelection(psoAngledLines, sf1);

                //TypedValue[] acTypeValAr1 = new TypedValue[4];

                //acTypeValAr1.SetValue(new TypedValue((int)DxfCode.Operator, "<or"), 0);
                //acTypeValAr1.SetValue(new TypedValue((int)DxfCode.Color, 5), 1);
                //acTypeValAr1.SetValue(new TypedValue((int)DxfCode.Color, 162), 2);
                //acTypeValAr1.SetValue(new TypedValue((int)DxfCode.Operator, "or>"), 3);

                //SelectionFilter sf1 = new SelectionFilter(acTypeValAr1);

                //PromptSelectionResult colourDelete             =   ed.SelectAll(sf1);

                //using (Transaction tr = doc.TransactionManager.StartTransaction())
                //{
                //    foreach (Entity en in colourDelete.Value)
                //    {
                //        Entity ent = tr.GetObject(en.ObjectId, OpenMode.ForWrite) as Entity;
                //        ent.Erase();
                //    }
                //}

                //using (Transaction tr = doc.TransactionManager.StartTransaction())
                //{
                //    BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                //    //BlockTableRecord btr = tr.GetObject( bt[]     );
                //}

                //ed.WriteMessage("there are {0} of the filtered lines here", filteredLines.Count);

              }
        }
Пример #46
0
 /// <summary>
 /// Pапрос выбора объектов
 /// </summary>      
 /// <param name="msg">Строка запроса</param>
 /// <exception cref="Exception">Отменено пользователем.</exception>
 /// <returns>Список выбранных объектов</returns>
 public static List<ObjectId> Select(this Editor ed, string msg)
 {
     var selOpt = new PromptSelectionOptions();
     selOpt.MessageForAdding = msg;
     var selRes = ed.GetSelection(selOpt);
     if (selRes.Status == PromptStatus.OK)
     {
         return selRes.Value.GetObjectIds().ToList();
     }
     else
     {
         throw new Exception("\nОтменено пользователем");
     }
 }
Пример #47
0
        //Get selected AEC Objects (Only works for Conduit as of V1.0)
        public void GetAECObjects(Double distRes)
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;

            try
            {
                PromptSelectionResult psr = ed.SelectImplied(); //Get user selection.

                if (psr.Status == PromptStatus.OK)
                {
                    ed.SetImpliedSelection(new ObjectId[0]);
                }
                else
                {
                    PromptSelectionOptions selOpts = new PromptSelectionOptions();
                    selOpts.MessageForAdding = "\nSelect objects: ";
                    psr = ed.GetSelection(selOpts);
                }

                // Get the selected objects one by one.
                Transaction tr = doc.TransactionManager.StartTransaction();
                using (tr)
                {
                    try
                    {
                        double[] partSizes = new double[50]; // accept 50 selected objects
                        string[] partCndtType = new string[50];
                        double[] pSizeMult = new double[50]; // accept 50 selected objects
                        int total = 0;
                        ObjectId[] objIds = psr.Value.GetObjectIds();

                        //Ask for weight Table type
                        String weightTable = "";
                        PromptKeywordOptions pko = new PromptKeywordOptions("");
                        pko.Message = "\nEnter table to use calculations from ";
                        pko.Keywords.Add("Water");
                        pko.Keywords.Add("Conductor");
                        pko.Keywords.Default = "Water";
                        pko.AllowNone = true;

                        PromptResult pr = ed.GetKeywords(pko);

                        weightTable = pr.StringResult;

                        //Loop through Selected Conduits.
                        foreach (ObjectId objId in objIds)
                        {

                            Entity ent = (Entity)tr.GetObject(objId, OpenMode.ForRead); //use entity as object type to find.

                            Member mem = tr.GetObject(objId, OpenMode.ForRead) as Member; //set as member (needed to process AEC)
                            partSizes[total] = GetPartSize(mem);
                            partCndtType[total] = GetPartCndtType(mem);
                            pSizeMult[total] = CalcWeightPerFoot(partSizes[total].ToString(), partCndtType[total], weightTable); //now call the calculation loop for each size.
                            ed.WriteMessage("\n[" + total.ToString() + "] " + partSizes[total].ToString() + " x " + pSizeMult[total].ToString()); //write out to command line for verification.
                            total += 1; //increase increment for loop.
                        }

                        Double multSum = pSizeMult.Sum(); //sum up the multipliers for use later.
                        ed.WriteMessage("\n\nThe Sum of the multipliers= " + multSum.ToString());

                        /*Finally Calculate the Point Load weight.*/
                        // Convert the distance to feet.
                        distRes = distRes / 12;

                        ed.WriteMessage("\n\nFormula: (" + multSum.ToString() + " * " + distRes.ToString() + ") / 2");

                        // Multiply the sum of the multipliers by the distance, then divide by 2 to get the individual point load.
                        Double finalCalc = (multSum * distRes) / 2;

                        finalCalc = Math.Round(finalCalc, 1); //Round the calculation to 1 decimal point ex. 3.4

                        ed.WriteMessage("\n\nThe point load= " + finalCalc.ToString() + " x2");

                        // Place point load tag on drawing.
                        Class2.Commands.ImportBlocks(); //Imports the dynamic block from external dwg.
                        Class2.Commands.BlockJigCmd(finalCalc); //Jigs the block with the correct values and places in drawing at user point.
                    }
                    catch (SystemException ex)
                    {
                        ed.WriteMessage("Error" + ex.ToString());
                    }
                    tr.Commit();
                }

            }
            catch (SystemException ex)
            {
                ed.WriteMessage("Error " + ex.ToString());
            }
        }
        /// <summary>
        /// Prompts the user for a selection of blocks, returns a list of block references
        /// </summary>
        /// <param name="tr"></param>
        /// <returns></returns>
        private IEnumerable<BlockReference> PromptForBlock(Transaction tr)
        {
            var blocks = new List<BlockReference>();
            var filList = new[] {new TypedValue((int) DxfCode.Start, "INSERT")};
            var filter = new SelectionFilter(filList);
            var opts = new PromptSelectionOptions {MessageForAdding = "Select block references: "};

            PromptSelectionResult res = _ed.GetSelection(opts, filter);

            if (res.Status == PromptStatus.OK)
            {
                SelectionSet selSet = res.Value;
                ObjectId[] idArray = selSet.GetObjectIds();
                blocks.AddRange(
                    idArray.Select(blkId => (BlockReference) tr.GetObject(blkId, OpenMode.ForWrite)).Where(
                        blkRef => ValidateBlock(blkRef, tr)));
            }
            return blocks;
        }
Пример #49
0
 /// <summary>
 /// Pапрос выбора блоков
 /// </summary>      
 /// <param name="msg">Строка запроса</param>
 /// <exception cref="Exception">Отменено пользователем.</exception>
 /// <returns>Список выбранных блоков</returns>
 public static List<ObjectId> SelectBlRefs(this Editor ed, string msg)
 {
     var filList = new TypedValue[1] { new TypedValue((int)DxfCode.Start, "INSERT") };
     SelectionFilter filter = new SelectionFilter(filList);
     var selOpt = new PromptSelectionOptions();
     selOpt.MessageForAdding = msg;
     var selRes = ed.GetSelection(selOpt, filter);
     if (selRes.Status == PromptStatus.OK)
     {
         return selRes.Value.GetObjectIds().ToList();
     }
     else
     {
         throw new Exception("\nОтменено пользователем");
     }
 }
Пример #50
0
        // Works!! MUST CHECK if something is selected - if not, then return null please for goddsakes!!
        public static SelectionSet GetSS(SelectionFilter sf)
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;

            //clear the current selection
            ObjectId[] idarrayEmpty = new ObjectId[0];
            ed.SetImpliedSelection(idarrayEmpty);

            PromptSelectionOptions pso = new PromptSelectionOptions();
            pso.MessageForAdding = "\nSelect block(s)";

            PromptSelectionResult psr = ed.GetSelection(pso, sf);

            return psr.Value;
        }
Пример #51
0
        public void List()
        {
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;

            try
            {
                PromptSelectionOptions Opts = new PromptSelectionOptions();

                //Build	a filter list so that only block references	are	selected
                TypedValue[] filList =	{ new TypedValue((int)DxfCode.Start, "INSERT") };

                SelectionFilter filter = new SelectionFilter(filList);
                PromptSelectionResult res = ed.GetSelection(Opts, filter);

                //Do nothing if	selection is unsuccessful
                if (res.Status != PromptStatus.OK)
                    return;

                Autodesk.AutoCAD.EditorInput.SelectionSet SS = res.Value;
                ObjectId[] idArray = SS.GetObjectIds();

                //List the selection set
                EmployeeCount(idArray);
            }
            catch
            {
                ed.WriteMessage("Error in Listing Employees");
            }
        }