/// <summary> /// Создание ассоциативной штриховки по полилинии /// Полилиния должна быть в базе чертежа /// </summary> public static Hatch?CreateAssociativeHatch( [NotNull] Curve loop, [NotNull] BlockTableRecord cs, [NotNull] Transaction t, double scale, string pattern = "SOLID", [CanBeNull] string layer = null, LineWeight lw = LineWeight.LineWeight015) { var h = new Hatch(); if (layer != null) { Layers.LayerExt.CheckLayerState(layer); h.Layer = layer; } h.LineWeight = lw; h.Linetype = SymbolUtilityServices.LinetypeContinuousName; h.PatternScale = scale; h.SetHatchPattern(HatchPatternType.PreDefined, pattern); cs.AppendEntity(h); t.AddNewlyCreatedDBObject(h, true); h.Associative = true; h.HatchStyle = HatchStyle.Normal; // добавление контура полилинии в гштриховку var ids = new ObjectIdCollection { loop.Id }; try { h.AppendLoop(HatchLoopTypes.Default, ids); } catch (Exception ex) { Logger.Log.Error(ex, $"CreateAssociativeHatch"); h.Erase(); return(null); } h.EvaluateHatch(true); var orders = (DrawOrderTable)cs.DrawOrderTableId.GetObject(OpenMode.ForWrite); orders.MoveToBottom(new ObjectIdCollection(new[] { h.Id })); return(h); }
/// <summary> /// Создание ассоциативной штриховки по полилинии /// Полилиния должна быть в базе чертежа /// </summary> public static Hatch CreateAssociativeHatch(Curve loop, BlockTableRecord cs, Transaction t, string pattern = "SOLID", string layer = null, LineWeight lw = LineWeight.LineWeight015) { var h = new Hatch(); h.SetDatabaseDefaults(); if (layer != null) { Layers.LayerExt.CheckLayerState(layer); h.Layer = layer; } h.LineWeight = lw; h.Linetype = SymbolUtilityServices.LinetypeContinuousName; h.SetHatchPattern(HatchPatternType.PreDefined, pattern); cs.AppendEntity(h); t.AddNewlyCreatedDBObject(h, true); h.Associative = true; h.HatchStyle = HatchStyle.Normal; // добавление контура полилинии в гштриховку var ids = new ObjectIdCollection(); ids.Add(loop.Id); try { h.AppendLoop(HatchLoopTypes.Default, ids); } catch (Exception ex) { Logger.Log.Error(ex, $"CreateAssociativeHatch"); h.Erase(); return null; } h.EvaluateHatch(true); var orders = cs.DrawOrderTableId.GetObject(OpenMode.ForWrite) as DrawOrderTable; orders.MoveToBottom(new ObjectIdCollection(new[] { h.Id })); return h; }
private static void SetLayersByList(Database db, GeologyHatchLayersViewModel viewModel, SelectionSet acSSet, Editor ed) { Dictionary <string, List <ObjectId> > hatchTypesLookup = new Dictionary <string, List <ObjectId> >(); List <ObjectId> layerList = new List <ObjectId>(); PaletteSet ps = null; SelectLayerViewModel paletteViewModel = null; SelectLayerView paletteView = null; List <LayerTableRecord> ltrList = null; using (Transaction tr = db.TransactionManager.StartTransaction()) { //Создать слои согласно списку из экселя (если их еще нет) List <string> layerNames = viewModel.LayerNames; short colorIndex = 1; foreach (string ln in layerNames) { layerList.Add(Utils.CreateLayerIfNotExists(ln, db, tr, color: Color.FromColorIndex(ColorMethod.ByAci, colorIndex), lineWeight: LineWeight.LineWeight030)); colorIndex = Convert.ToByte((colorIndex + 1) % 255); if (colorIndex == 0) { colorIndex = 1; } } ltrList = layerList.Select(id => (LayerTableRecord)tr .GetObject(id, OpenMode.ForRead)).ToList(); //Разбить все штриховки по группам в соответствии с их свойствами foreach (ObjectId hatchId in acSSet.GetObjectIds()) { Hatch hatch = (Hatch)tr.GetObject(hatchId, OpenMode.ForWrite); string key = GetHatchTypeKey(hatch); List <ObjectId> currTypeList = null; hatchTypesLookup.TryGetValue(key, out currTypeList); if (currTypeList == null) { currTypeList = new List <ObjectId>(); hatchTypesLookup.Add(key, currTypeList); } currTypeList.Add(hatchId); } tr.Commit(); } if (hatchTypesLookup.Values.Count > 0) { ps = new PaletteSet("Выбор слоя"); ps.Style = PaletteSetStyles.ShowPropertiesMenu | PaletteSetStyles.ShowCloseButton; paletteViewModel = new SelectLayerViewModel(ltrList, ps); paletteView = new SelectLayerView(); paletteView.DataContext = paletteViewModel; ps.AddVisual("SelectLayerPaletteControl", paletteView); ps.DockEnabled = DockSides.Left; ps.Visible = false; //последовательно подсвечивать каждую группу (при этом зумировать камеру, чтобы было их видно) //Открывать панель со списком геологических элементов, полученным из экселя //и ожидать когда пользователь выберет в этом списке нужный элемент //присвоить выбранным штриховкам выбранный слой foreach (List <ObjectId> hatchIdsGroup in hatchTypesLookup.Values) { using (Transaction tr = db.TransactionManager.StartTransaction()) { List <Hatch> hatches = hatchIdsGroup .Select(id => (Hatch)tr.GetObject(id, OpenMode.ForWrite)).ToList(); try { Utils.Highlight(hatches, true); //зумирование на первой штриховке из списка Hatch sampleHatch = hatches.First(h => h.Bounds != null); Utils.ZoomWin(ed, sampleHatch.Bounds.Value.MinPoint, sampleHatch.Bounds.Value.MaxPoint); //Открыть панель и дать выбрать один из слоев ps.Visible = true; ps.Size = new System.Drawing.Size(420, 350); ps.Dock = DockSides.Left; bool trueCancel = false;//Dock ВЫЗЫВАЕТ ОТМЕНУ GetKeywords, поэтому первый раз отмена не завершает команду PromptResult pr = null; const string kwAcceptLayer = "ПРИнятьСлой"; const string kwSkip = "ПРОпустить"; const string kwErase = "УдалитьОбъекты"; do { PromptKeywordOptions pko = new PromptKeywordOptions("\nВыберите нужный слой"); pko.Keywords.Add(kwAcceptLayer); pko.Keywords.Add(kwSkip); pko.Keywords.Add(kwErase); pko.AllowNone = true; pr = ed.GetKeywords(pko); if (pr.Status == PromptStatus.Cancel) { if (trueCancel) { return; } trueCancel = true; } } while (paletteViewModel.SelectedLayer == null && !(pr.StringResult == kwSkip || pr.StringResult == kwErase)); ps.Visible = false; switch (pr.StringResult) { case null: case "": //пустой ввод - то же что и принять case kwAcceptLayer: ObjectId selectedLayerId = (paletteViewModel.SelectedLayer as LayerTableRecord).Id; paletteViewModel.SelectedLayer = null; foreach (Hatch hatch in hatches) { hatch.LayerId = selectedLayerId; hatch.ColorIndex = 256; } break; case kwErase: foreach (Hatch hatch in hatches) { hatch.Erase(); } break; } } catch (System.Exception ex) { throw ex; } finally { Utils.Highlight(hatches, false); ps.Visible = false; } tr.Commit(); } } } }
public void CreateLandSiteBlock() { Document adoc = Application.DocumentManager.MdiActiveDocument; if (adoc == null) { return; } Database db = adoc.Database; Editor ed = adoc.Editor; List <Entity> selectedPolylines = null; try { if (firstTimeCall) { while (true) { string kw1 = selectOnlyPolylines ? "НЕТолькоПолилинии" : "ТолькоПолилинии"; string kw2 = setColor ? "ВсеЦветаПоСлою" : "МенятьЦвет"; PromptKeywordOptions pko = new PromptKeywordOptions( "\nВыбор только полилиний - " + selectOnlyPolylines + "\nМенять цвет объектов в блоке - " + setColor + "\nЗадайте параметры или пустой ввод для продолжения"); pko.Keywords.Add(kw1); pko.Keywords.Add(kw2); pko.AllowNone = true; PromptResult pr = ed.GetKeywords(pko); if (pr.Status == PromptStatus.Cancel) { return; } if (String.IsNullOrEmpty(pr.StringResult)) { break; } if (pr.StringResult.Equals(kw1)) { selectOnlyPolylines = !selectOnlyPolylines; } else if (pr.StringResult.Equals(kw2)) { setColor = !setColor; } } Application.DocumentManager.DocumentActivated += DocumentActivated_EventHandler; firstTimeCall = false; } //Выбор полилиний PromptSelectionOptions pso = new PromptSelectionOptions(); pso.MessageForAdding = selectOnlyPolylines ? "\nВыберите полилинии границ участка" : "\nВыберите объекты"; SelectionFilter flt = null; if (selectOnlyPolylines) { TypedValue[] tv = new TypedValue[] { new TypedValue(0, "LWPOLYLINE") }; flt = new SelectionFilter(tv); } else { TypedValue[] tv = new TypedValue[] { new TypedValue(-4, "<NOT"), new TypedValue(0, "INSERT"), new TypedValue(-4, "NOT>") }; flt = new SelectionFilter(tv); } PromptSelectionResult acSSPrompt = adoc.Editor.GetSelection(pso, flt); if (acSSPrompt.Status == PromptStatus.OK) { SelectionSet acSSet = acSSPrompt.Value; //Подсветить выбранные полилинии selectedPolylines = new List <Entity>(); using (Transaction tr = db.TransactionManager.StartTransaction()) { foreach (ObjectId id in acSSet.GetObjectIds()) { Entity ent = (Entity)tr.GetObject(id, OpenMode.ForRead); selectedPolylines.Add(ent); } tr.Commit(); } Utils.Highlight(selectedPolylines, true); //Указание текстового примитива PromptEntityOptions peo1 = new PromptEntityOptions("\nУкажите текстовый примитив для создания атрибута"); peo1.SetRejectMessage("\nМожно выбрать только поверхность TIN"); peo1.AddAllowedClass(typeof(DBText), true); PromptEntityResult per1 = ed.GetEntity(peo1); //Снять подсветку Utils.Highlight(selectedPolylines, false); string blockName = null; using (Transaction tr = db.TransactionManager.StartTransaction()) { string initialName = null; DBText dBText = null; if (per1.Status == PromptStatus.OK) { dBText = tr.GetObject(per1.ObjectId, OpenMode.ForRead) as DBText; initialName = dBText.TextString; } else { initialName = Guid.NewGuid().ToString(); } //Создать новый блок blockName = Utils.GetSafeSymbolName(initialName); BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable; if (bt.Has(blockName)) { //Если блок с таким именем уже есть, то найти такое имя, которого еще нет int i = 0; string nameToCheck = null; do { nameToCheck = blockName + "_" + i; i++; }while (bt.Has(nameToCheck)); blockName = nameToCheck; } #region //Создать таблицу map3d для записи правильного названия блока (если еще нет) --- ОТМЕНЕНО, ТАК КАК НЕ ВИДНО В NAVIS //MapApplication mapApp = HostMapApplicationServices.Application; //ProjectModel projModel = mapApp.ActiveProject; //Tables odTables = projModel.ODTables; //Autodesk.Gis.Map.ObjectData.Table odTable = null; ////FieldDefinitions fDefs = null; //if (!odTables.IsTableDefined("ReferenceNumber")) //{ // FieldDefinitions fDefs = mapApp.ActiveProject.MapUtility.NewODFieldDefinitions(); // FieldDefinition def = fDefs.Add("ReferenceNumber", "Условный номер участка", // Autodesk.Gis.Map.Constants.DataType.Character, 0); // odTables.Add("ReferenceNumber", fDefs, "", true); //} //odTable = odTables["ReferenceNumber"]; #endregion //Создание нового блока BlockTableRecord btr = new BlockTableRecord(); btr.Name = blockName.Trim(); ObjectId btrId = bt.Add(btr); tr.AddNewlyCreatedDBObject(btr, true); ObjectId layerId = ObjectId.Null; ObjectIdCollection objectIdCollection = new ObjectIdCollection(); //Копирование всех полилиний в созданный блок foreach (ObjectId id in acSSet.GetObjectIds()) { Entity polyline = (Entity)tr.GetObject(id, OpenMode.ForRead); if (layerId == ObjectId.Null) { layerId = polyline.LayerId;//Запомнить слой. } Entity polylineCopy = (Entity)polyline.Clone(); if (polylineCopy is Polyline) { (polylineCopy as Polyline).Elevation = 0.0; } //Поменять цвет if (setColor) { polylineCopy.ColorIndex = colorIndex; } else { polylineCopy.ColorIndex = 256;//По слою } objectIdCollection.Add(btr.AppendEntity(polylineCopy)); tr.AddNewlyCreatedDBObject(polylineCopy, true); } //Создать атрибут внутри блока //using (Transaction trAttr = db.TransactionManager.StartTransaction()) if (dBText != null) { using (AttributeDefinition acAttDef = new AttributeDefinition()) { acAttDef.Position = dBText.Position != Point3d.Origin ? dBText.Position : dBText.AlignmentPoint; acAttDef.Verifiable = true; acAttDef.Prompt = "Условный номер"; acAttDef.Tag = "ReferenceNumber"; acAttDef.TextString = initialName; acAttDef.Height = dBText.Height; acAttDef.Justify = dBText.Justify; acAttDef.TextStyleId = dBText.TextStyleId; if (setColor) { acAttDef.ColorIndex = colorIndex; } else { acAttDef.ColorIndex = 256;//По слою } acAttDef.WidthFactor = dBText.WidthFactor; acAttDef.LayerId = dBText.LayerId; btr.AppendEntity(acAttDef); tr /*Attr*/.AddNewlyCreatedDBObject(acAttDef, true); //trAttr.Commit(); } } //Создать штриховку http://adndevblog.typepad.com/autocad/2012/07/hatch-using-the-autocad-net-api.html if (selectOnlyPolylines) { using (Hatch oHatch = new Hatch()) { try { Vector3d normal = new Vector3d(0.0, 0.0, 1.0); oHatch.Normal = normal; oHatch.Elevation = 0.0; oHatch.PatternScale = objectIdCollection.Count == 1 ? 2.0 : 10.0; oHatch.SetHatchPattern(HatchPatternType.PreDefined, "ANSI37"); if (setColor) { oHatch.ColorIndex = colorIndex; } else { oHatch.ColorIndex = 256;//По слою } oHatch.LayerId = layerId; btr.AppendEntity(oHatch); tr.AddNewlyCreatedDBObject(oHatch, true); oHatch.Associative = true; foreach (ObjectId id in objectIdCollection) { oHatch.AppendLoop((int)HatchLoopTypes.Default, new ObjectIdCollection() { id }); } oHatch.EvaluateHatch(true); } catch (System.Exception) { try { oHatch.Erase(true); } catch { } } } } //Создание вхождения этого блока BlockTableRecord ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite); BlockReference br = new BlockReference(Point3d.Origin, btrId); br.LayerId = layerId; ObjectId brId = ms.AppendEntity(br); tr.AddNewlyCreatedDBObject(br, true); //Заполнить значение атрибута AttributeCollection ac = br.AttributeCollection; //AttributeReference ar = (AttributeReference)tr.GetObject(ac[0], OpenMode.ForWrite); //ar.TextString = initialName; //Привязать к вхождению блока запись таблицы map3d --- ОТМЕНЕНО, ТАК КАК НЕ ВИДНО В NAVIS //Records odrecords = odTable.GetObjectTableRecords(Convert.ToUInt32(0), brId, // Autodesk.Gis.Map.Constants.OpenMode.OpenForRead, false); //Record odRecord = Autodesk.Gis.Map.ObjectData.Record.Create(); //odTable.InitRecord(odRecord); //Autodesk.Gis.Map.Utilities.MapValue mapVal = odRecord[0]; //mapVal.Assign(name); //odTable.AddRecord(odRecord, br); tr.Commit(); } if (!String.IsNullOrEmpty(blockName) && per1.Status == PromptStatus.OK) { adoc.SendStringToExecute("_ATTSYNC _N " + blockName + "\n", false, false, false); } adoc.SendStringToExecute("S1NF0_CreateLandSiteBlock\n", false, false, false); } } catch (System.Exception ex) { //Utils.ErrorToCommandLine(ed, "Ошибка при создании контуров разметки", ex); CommonException(ex, "Ошибка при создании контуров разметки"); } finally { //Снять подсветку Utils.Highlight(selectedPolylines, false); } }