Esempio n. 1
0
        /// <summary>
        /// Вставка блока в чертеж - интерактивная (BlockInsertJig)
        /// </summary>
        public static ObjectId Insert(string blName, LayerInfo?layer, List <Property>?props, bool explode = false)
        {
            var doc = Application.DocumentManager.MdiActiveDocument;

            if (doc == null)
            {
                return(ObjectId.Null);
            }
            var db = doc.Database;
            var ed = doc.Editor;

            using var @lock = doc.LockDocument();
            using var t     = db.TransactionManager.StartTransaction();
            var bt = (BlockTable)t.GetObject(db.BlockTableId, OpenMode.ForRead);

            if (!bt.Has(blName))
            {
                throw new Exception("Блок не определен в чертеже " + blName);
            }

            var idBlBtr = bt[blName];
            var pt      = Point3d.Origin;
            var br      = new BlockReference(pt, idBlBtr);

            br.SetDatabaseDefaults();

            if (layer != null)
            {
                layer.CheckLayerState();
                br.Layer = layer.Name;
            }

            var spaceBtr      = (BlockTableRecord)t.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
            var idBlRefInsert = spaceBtr.AppendEntity(br);

            t.AddNewlyCreatedDBObject(br, true);

            if (props != null && br.IsDynamicBlock)
            {
                foreach (DynamicBlockReferenceProperty item in br.DynamicBlockReferencePropertyCollection)
                {
                    var prop = props.FirstOrDefault(p =>
                                                    p.Name.Equals(item.PropertyName, StringComparison.OrdinalIgnoreCase));
                    if (prop != null)
                    {
                        try
                        {
                            item.Value = prop.Value;
                        }
                        catch (Exception ex)
                        {
                            Logger.Log.Error(ex,
                                             msg: $"Ошибка типа значения для дин параметра '{item.PropertyName}' " +
                                             $"при вставке блока '{blName}': тип устанавливаемого значение '{prop.Value.GetType()}', " +
                                             $"а должен быть тип '{item.UnitsType}'");
                        }
                    }
                }
            }

            // jig
            var entJig = new Jigs.BlockInsertJig(br);
            var pr     = ed.Drag(entJig);

            if (pr.Status == PromptStatus.OK)
            {
                var btrBl = (BlockTableRecord)t.GetObject(idBlBtr, OpenMode.ForRead);
                if (btrBl.HasAttributeDefinitions)
                {
                    AddAttributes(br, btrBl, t);
                }
                if (explode)
                {
                    var owner = br.BlockId.GetObject <BlockTableRecord>(OpenMode.ForWrite);
                    using var explodes = new DBObjectCollection();
                    br.Explode(explodes);
                    foreach (Entity ent in explodes)
                    {
                        owner.AppendEntity(ent);
                        t.AddNewlyCreatedDBObject(ent, true);
                        ent.Layer = br.Layer;
                    }

                    br.Erase();
                }
            }
            else
            {
                br.Erase();
                idBlRefInsert = ObjectId.Null;
            }

            t.Commit();

            return(idBlRefInsert);
        }
Esempio n. 2
0
        /// <summary>
        /// Вставка блока в чертеж - интерактивная (BlockInsertJig)
        /// </summary>        
        public static ObjectId Insert(string blName, Layers.LayerInfo layer, List<Property> props)
        {
            ObjectId idBlRefInsert = ObjectId.Null;
            Document doc = AcAp.DocumentManager.MdiActiveDocument;
            if (doc == null) return ObjectId.Null;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            using (doc.LockDocument())
            using (var t = db.TransactionManager.StartTransaction())
            {
                var bt = t.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                if (!bt.Has(blName))
                {
                    throw new Exception("Блок не определен в чертеже " + blName);
                }

                ObjectId idBlBtr = bt[blName];
                Point3d pt = Point3d.Origin;
                BlockReference br = new BlockReference(pt, idBlBtr);
                br.SetDatabaseDefaults();
                if (layer != null)
                {
                    Layers.LayerExt.CheckLayerState(layer);
                    br.Layer = layer.Name;
                }

                var spaceBtr = (BlockTableRecord)t.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                idBlRefInsert = spaceBtr.AppendEntity(br);
                t.AddNewlyCreatedDBObject(br, true);

                if (props != null && br.IsDynamicBlock)
                {
                    foreach (DynamicBlockReferenceProperty item in br.DynamicBlockReferencePropertyCollection)
                    {
                        var prop = props.FirstOrDefault(p => p.Name.Equals(item.PropertyName, StringComparison.OrdinalIgnoreCase));
                        if (prop != null)
                        {
                            try
                            {
                                item.Value = prop.Value;
                            }
                            catch (Exception ex)
                            {
                                Logger.Log.Error(ex, $"Ошибка типа значения для дин параметра '{item.PropertyName}' " +
                                $"при вставке блока '{blName}': тип устанавливаемого значение '{prop.Value.GetType()}', " +
                                $"а должен быть тип '{item.UnitsType}'");
                            }
                        }
                    }
                }

                // jig
                Jigs.BlockInsertJig entJig = new Jigs.BlockInsertJig(br);
                var pr = ed.Drag(entJig);
                if (pr.Status == PromptStatus.OK)
                {
                    var btrBl = t.GetObject(idBlBtr, OpenMode.ForRead) as BlockTableRecord;
                    if (btrBl.HasAttributeDefinitions)
                        AddAttributes(br, btrBl, t);
                }
                else
                {
                    br.Erase();
                    idBlRefInsert = ObjectId.Null;
                }
                t.Commit();
            }
            return idBlRefInsert;
        }