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(); }
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); }
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); } } }
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); } }
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); }
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); } }
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); }
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
/// <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()); }
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); } }
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); }
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()); }
/// <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); }
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"); }
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); }
/// <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); }
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); } } } } }
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; }
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); }
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(); } } }
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(); } } }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
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); }
/// <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); }
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; }
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(); } }
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 { } }
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); } }
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); } }
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(); } }
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; } }
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(); } } }
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); } }
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); }
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); } }
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(); }
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(); }
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); } }
// запрос выбора объектов этажа 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("Отменено пользователем."); } }
public static IAcedCmdArg Argument(PromptSelectionOptions options) { return new PromptSelectionArgument(options); }
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); } }
/// <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Отменено пользователем"); } }
//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; }
/// <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Отменено пользователем"); } }
// 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; }
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"); } }