Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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;
        }
Beispiel #3
0
        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);
            }
        }