Thứ Năm, 5 tháng 12, 2024

Code c# Nhập block layer dimstyle từ thư viện | Import block layer dimstyle from library drawing | AutoCad dotNet

Ứng dụng được phát triển/Sưu tầm bởi đội ngũ AutoLISP Thật là đơn giản
   

Thông tin thêm: 👉👉👉

Sao chép toàn bộ block/layer/dimstyle

1 Hàm InitialDWG

Chèn vào class của bạn
Code:
        public static void InitialDWG(string dwgpath, bool dimstyle = true, bool layer = true, bool block = true)
        {
            string filepath = dwgpath;
            if (!File.Exists(filepath)) return;

            Database db = HostApplicationServices.WorkingDatabase;
            using (Transaction mytr = db.TransactionManager.StartTransaction())
            {
                Database sourceDb = new Database(false, true);
                sourceDb.ReadDwgFile(dwgpath, System.IO.FileShare.Read, true, "");

                using (Transaction tr = sourceDb.TransactionManager.StartTransaction())
                {
                    if (layer)
                    {
                        try
                        {
                            var dtb = mytr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
                            ObjectIdCollection blockIds = new ObjectIdCollection();
                            LayerTable dtb1 = tr.GetObject(sourceDb.LayerTableId, OpenMode.ForRead) as LayerTable;
                            foreach (var i in dtb1)
                            {
                                LayerTableRecord btr = tr.GetObject(i, OpenMode.ForRead, false) as LayerTableRecord;
                                if (!dtb.Has(btr.Name))
                                {
                                    blockIds.Add(i);
                                    EDs.Princ("Layer is copied: " + btr.Name);
                                }
                                else
                                    EDs.Princ("Layer is exists: " + btr.Name);
                                btr.Dispose();
                            }
                            IdMapping mapping = new IdMapping();
                            sourceDb.WblockCloneObjects(blockIds, db.LayerTableId, mapping, DuplicateRecordCloning.Replace, false);
                        }
                        catch (Autodesk.AutoCAD.Runtime.Exception ee)
                        {
                            //MessageBox.Show("Error while open file:" + dwgpath + "\n" + ee.Message);
                        }
                    }
                    if (dimstyle)
                    {
                        try
                        {
                            DimStyleTable dtb = mytr.GetObject(db.DimStyleTableId, OpenMode.ForRead) as DimStyleTable;
                            ObjectIdCollection blockIds = new ObjectIdCollection();
                            DimStyleTable dtb1 = tr.GetObject(sourceDb.DimStyleTableId, OpenMode.ForRead) as DimStyleTable;
                            foreach (var i in dtb1)
                            {
                                DimStyleTableRecord btr = tr.GetObject(i, OpenMode.ForRead, false) as DimStyleTableRecord;
                                if (!dtb.Has(btr.Name))
                                {
                                    blockIds.Add(i);
                                    EDs.Princ("DimStyle is copied: " + btr.Name);
                                }
                                btr.Dispose();
                            }
                            IdMapping mapping = new IdMapping();
                            sourceDb.WblockCloneObjects(blockIds, db.DimStyleTableId, mapping, DuplicateRecordCloning.Replace, false);
                        }
                        catch (Autodesk.AutoCAD.Runtime.Exception ee)
                        {
                            //MessageBox.Show("Error while open file:" + dwgpath + "\n" + ee.Message);
                        }
                    }

                    if (block)
                    {
                        try
                        {
                            BlockTable bt = mytr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                            ObjectIdCollection blockIds = new ObjectIdCollection();
                            BlockTable bt1 = tr.GetObject(sourceDb.BlockTableId, OpenMode.ForRead) as BlockTable;
                            foreach (var i in bt1)
                            {
                                BlockTableRecord btr = tr.GetObject(i, OpenMode.ForRead, false) as BlockTableRecord;
                                if (!bt.Has(btr.Name) && !btr.IsAnonymous && !btr.IsLayout)
                                {
                                    blockIds.Add(i);
                                }
                            }

                            IdMapping mapping = new IdMapping();
                            sourceDb.WblockCloneObjects(blockIds, db.BlockTableId, mapping, DuplicateRecordCloning.Ignore, false);
                        }
                        catch (System.Exception ee)
                        {
                            //MessageBox.Show("Error while open file:" + dwgpath + "\n" + ee.Message);
                        }
                    }
                    tr.Commit();
                }

                sourceDb.CloseInput(true);
                mytr.Commit();
            }
            return;
        }

Sao chép block từ thư viện

2 Hàm InitialBlockFromFile

Hàm InitialBlockFromFile có tác dụng tạo mới 1 BlockReference. Nếu BlockTableRecord chưa có sẵn thì sẽ mở bản vẽ theo đường dẫn để Import.

Ngoài ra, còn khởi tạo sẵn các AttributeReference và lưu thành List để sử dụng theo yêu cầu sau này.

Code:
        public static BlockReference InitialBlockFromFile(string blockName, string filepath, Point3d p, double angle = 0, double scale = 1)
        {
            List<AttributeReference> atrs = new List<AttributeReference>();
            return InitialBlockFromFile(blockName, ref atrs, filepath, p, angle, scale);
        }

        public static BlockReference InitialBlockFromFile(string blockName, ref List<AttributeReference> atrs, string filepath, Point3d p, double angle = 0, double scale = 1)
        {
            Database db = HostApplicationServices.WorkingDatabase;
            BlockReference br = null;

            using (Transaction mytr = db.TransactionManager.StartTransaction())
            {
                BlockTable bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
                ObjectId blkid = ObjectId.Null;
                if (bt.Has(blockName) && !bt[blockName].IsErased)
                    blkid = bt[blockName];
                else
                {
                    if (!File.Exists(filepath)) return br;

                    Database sourceDb = new Database(false, true);

                    sourceDb.ReadDwgFile(filepath, System.IO.FileShare.Read, true, "");
using (Transaction tr = sourceDb.TransactionManager.StartTransaction()) { BlockTable bt1 = tr.GetObject(sourceDb.BlockTableId, OpenMode.ForRead) as BlockTable; ObjectIdCollection blockIds = new ObjectIdCollection(); if (bt1.Has(blockName)) { blkid = bt1[blockName]; blockIds.Add(blkid); IdMapping mapping = new IdMapping(); sourceDb.WblockCloneObjects(blockIds, db.BlockTableId, mapping, DuplicateRecordCloning.Replace, false); blkid = mapping[blkid].Value; } } sourceDb.CloseInput(true); sourceDb.Dispose(); } if (blkid != ObjectId.Null) { br = new BlockReference(p, blkid); br.ScaleFactors = new Scale3d(scale); br.Rotation = angle; BlockTableRecord blockDef = blkid.GetObject(OpenMode.ForRead) as BlockTableRecord; if (blockDef != null) { foreach (ObjectId id in blockDef) { DBObject obj = id.GetObject(OpenMode.ForRead); AttributeDefinition attDef = obj as AttributeDefinition; if (attDef != null && !attDef.Constant) { AttributeReference attRef = new AttributeReference(); attRef.SetAttributeFromBlock(attDef, br.BlockTransform); atrs.Add(attRef); } } } } mytr.Commit(); } return br; }


Load toàn bộ AttributeReference

3 Hàm Initial (Khởi tạo AttributeReference)

Trong dotNet, khi tạo 1 BlockReference mới, sẽ không có sẵn các Attribute. Do dó cần phải khởi tạo bằng hàm Initial sau đây .
Code:
        public static List<AttributeReference> Initial(this BlockReference br, Database db = null)
        {
            if (db == null) db = br.Database;
            if (db == null) db = HostApplicationServices.WorkingDatabase;

            List<AttributeReference> atrs = new List<AttributeReference>();
            ObjectId blkid = db.Search(br.RealName(), TBType.Block);
            if (blkid == ObjectId.Null) return atrs;
            using (var tr = blkid.Database.TransactionManager.StartTransaction())
            {
                BlockTableRecord blockDef = tr.GetObject(blkid, OpenMode.ForRead) as BlockTableRecord;
                if (blockDef != null)
                {
                    foreach (ObjectId id in blockDef)
                    {
                        DBObject obj = id.GetObject(OpenMode.ForRead);
                        AttributeDefinition attDef = obj as AttributeDefinition;
                        if (attDef != null && !attDef.Constant)
                        {
                            AttributeReference atr = new AttributeReference();

                            atr.SetAttributeFromBlock(attDef, br.BlockTransform);
                            atr.TextString = attDef.TextString;
                            atrs.Add(atr);
                        }
                    }
                }
                tr.Commit();
            }
            return atrs;
        }


Cách sử dụng:
Code:
        public static ObjectId InsertAtPoint(this Point3d p)
        {
            ObjectId id = ObjectId.Null;
            var db = HostApplicationServices.WorkingDatabase;

            var blkname = "YourBlockName";
            var att = "Z";
            double scale = 1.0;

            using (var tr = db.TransactionManager.StartTransaction())
            {
                var bt = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
                var br = Tbls.InitialBlockFromFile(blkname, "YourFilePath", p, 0, scale);

                id = bt.AppendEntity(br);
                tr.AddNewlyCreatedDBObject(br, true);

                var atrs = br.Initial();
                foreach (var atr in atrs)
                {
                    if (atr.Tag == att)
                        atr.TextString = p.Z.ToString("0.00");
                    br.AttributeCollection.AppendAttribute(atr);
                    tr.AddNewlyCreatedDBObject(atr, true);
                }
                tr.Commit();
            }
            return id;
        }


Nhóm AutoCAD dotNet


Link tham gia nhóm Zalo: http://dnz.lisp.vn
---------------------------------------------------------------------------------------------
Ứng dụng được phát triển bởi đội ngũ AutoLISP Thật là đơn giản - Tác giả ứng dụng in D2P

    

Mọi thông tin xin liên hệ Fanpage AutoLISP Thật là đơn giản!
Cảm ơn bạn đã theo dõi!

Không có nhận xét nào:

Đăng nhận xét

Tìm dimstyle textstyle blockdef trong Database | Search Dimstyle Textstyle BlockTableRecord in AutoCAD dotNet | Lập trình AutoCAD dotNet

Ứng dụng được phát triển/Sưu tầm bởi đội ngũ AutoLISP Thật là đơn giản     Thông tin thêm: 👉👉👉