Ejemplo n.º 1
0
        public static void MassiveSuperExplode(this SelectionSet set, out DBObjectCollection col)
        {
            var ids = set.GetObjectIds();

            if (ids == null)
            {
                throw new Exception("Nothing Selected.");
            }

            var bfs = from id in ids
                      let ent                     = id.GetObject(OpenMode.ForRead) as Entity
                                          let lyr = ent.LayerId.GetObject(OpenMode.ForRead) as LayerTableRecord
                                                    where !lyr.IsLocked && ent is BlockReference
                                                    select ent as BlockReference;

            var db         = set.Database();
            var bt         = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
            var modelspace = bt[BlockTableRecord.ModelSpace].GetObject(OpenMode.ForRead) as BlockTableRecord;

            col = new DBObjectCollection();

            modelspace.UpgradeOpen();
            foreach (var bf in bfs)
            {
                foreach (var explodedObj in SuperExplode(bf, modelspace))
                {
                    col.Add(explodedObj as DBObject);
                }
            }
            modelspace.DowngradeOpen();
        }
Ejemplo n.º 2
0
        public static void QuickBlock(this SelectionSet set, Point3d point, out BlockTableRecord btr, out BlockReference br)
        {
            var ents = from id in set.GetObjectIds()
                       let ent                         = id.GetObject(OpenMode.ForRead) as Entity
                                             let layer = ent.LayerId.GetObject(OpenMode.ForRead) as LayerTableRecord
                                                         where !layer.IsLocked
                                                         select ent;

            if (ents.Count() == 0)
            {
                throw new Exception("No invalid selected item.");
            }

            var db   = set.Database();
            var name = $"Z{DateTimeOffset.Now.ToUnixTimeMilliseconds()}";
            var bt   = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;

            if (bt.Has(name))
            {
                throw new Exception("Name used.");
            }

            var msr = bt[BlockTableRecord.ModelSpace].GetObject(OpenMode.ForWrite) as BlockTableRecord;

            btr = new BlockTableRecord {
                Name = name
            };

            var vt_toOrigin   = point.GetVectorTo(new Point3d(0, 0, 0));
            var mt_toOrigin   = Matrix3d.Displacement(vt_toOrigin);
            var mt_keepStatic = Matrix3d.Displacement(new Vector3d(0, 0, 0));

            foreach (var ent in ents)
            {
                //移动和复制分开,不然标注位置不会移动!
                var duplicatedEnt = ent.GetTransformedCopy(mt_keepStatic);
                duplicatedEnt.TransformBy(mt_toOrigin);
                btr.AppendEntity(duplicatedEnt);
                ent.UpgradeOpen();
                ent.Erase();
                ent.DowngradeOpen();
            }

            bt.UpgradeOpen();
            bt.Add(btr);

            var space = bt[BlockTableRecord.ModelSpace].GetObject(OpenMode.ForWrite) as BlockTableRecord;

            br = new BlockReference(point, btr.Id);
            space.AppendEntity(br);
            space.DowngradeOpen();
        }