Berbagi teknologi

Pengembangan sekunder CAD (12) - Definisi dan penggunaan blok

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Blok adalah poin pengetahuan yang sangat penting dalam CAD. Hari ini saya akan memberikan beberapa klasifikasi dan pengenalan blok, serta definisi dan referensi blok.

1. Konsep

1.1 Definisi blok

Blok adalah entitas yang ditentukan oleh beberapa objek grafis yang terkait secara logis. Keuntungannya adalah dapat menyatukan standar kerja dan meningkatkan efisiensi kerja, karena suatu objek dalam kehidupan bukanlah suatu unit yang sederhana, tetapi dapat terdiri dari beberapa unit yang dapat mewakili struktur tersebut dengan baik.

Inti dari sebuah blok adalah kumpulan objek entitas yang disimpan dalam catatan tabel blok.

1.2 Definisi blok properti

Blok atribut terdiri dari entitas dan informasi tambahan (atribut). Definisi blok dalam blok atribut sama dengan blok sederhana, dan definisi atribut terutama dicapai melalui atribut dan fungsi yang relevan dari kelas AttributeDefinition. . Implementasi khusus meliputi:

  1. Sebuah instance dari kelas AttributeDefinition dan menetapkan nilai atribut objek;
  2. Karena definisi atribut suatu blok juga dapat dianggap sebagai entitas di dalam blok, definisi atribut dapat dilampirkan ke blok melalui fungsi anggota AppendEntity dari kelas rekaman tabel blok.

Diantaranya, nilai atribut yang ditentukan oleh atribut terutama meliputi:

  • Titik penyisipan, tinggi, sudut rotasi, perataan dan lebar teks;
  • Nilai default atribut;
  • Mode atribut, seperti mode tak terlihat, mode Tak Terlihat, mode konstan, mode Konstan, mode verifikasi, mode Verifikasi, dan mode prasetel, Preset;
  • Nama tag atribut.

1.3 Definisi blok dinamis

Blok dinamis memungkinkan kita membuat blok dengan tingkat fleksibilitas dan kemampuan penyesuaian yang tinggi. Karena ketika balok tradisional dimasukkan ke dalam gambar, ukuran, bentuk, dan lokasinya biasanya tetap. Blok dinamis, di sisi lain, dapat menyesuaikan properti geometrisnya melalui interaksi antarmuka pengguna (seperti menyeret pengendali tindakan) tanpa harus mendefinisikan ulang seluruh blok atau mengedit komponennya secara manual.

1.4 Klasifikasi dan operasi blok

Blok terutama dibagi menjadi blok sederhana, blok atribut, dan blok dinamis. Untuk blok, terutama ada operasi definisi blok, operasi referensi blok (yaitu, operasi penyisipan blok), dan pengeditan blok.

2. Definisi blok

2.1 Definisi blok

Apa pun jenis bloknya, definisinya kira-kira sama (blok atribut perlu menambahkan objek atribut).

  1. Gunakan fungsi GetObject() dari kelas Transaksi untuk mendapatkan objek tabel blok;
  2. Buat objek BlockTableRecord dan atur nama blok;
  3. Buat objek entitas yang membentuk blok;
  4. Panggil fungsi AppendEntity dari kelas BlockTableRecord untuk menulis entitas yang membentuk blok ke dalam catatan tabel blok;
  5. Panggil fungsi Tambah dari kelas BlockTable untuk menulis catatan tabel blok yang dibuat ke dalam tabel blok gambar saat ini.

Kode spesifiknya adalah sebagai berikut:

public static ObjectId AddBlockThroughDB(this Database db, string blockName, List<Entity> ents)
        {
            //声明ObjectId,用于返回
            ObjectId entId = ObjectId.Null;
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                BlockTable bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForWrite);
                BlockTableRecord btr = new BlockTableRecord();
                btr.Name = blockName;
                for (int ii = 0; ii < ents.Count; ii++)
                {
                    Entity ent = ents[ii];
                    btr.AppendEntity(ent);
                }                    
                entId = bt.Add(btr);
                tr.AddNewlyCreatedDBObject(btr, true);
                tr.Commit();
            }
            return entId;
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

2.2 Definisi blok properti

Di atas hanyalah definisi dari blok sederhana. Untuk blok atribut, seperti namanya, Anda perlu mendefinisikan bidang atribut di blok tersebut (kita dapat memahaminya sebagai mendefinisikan variabel atribut, yang perlu diubah menjadi nilai variabel tertentu ​ketika direferensikan).
Definisi blok properti, kita dapat menambahkan properti ke dalamnya dengan menambahkan properti.

		 /// <summary>
         /// 块添加属性
         /// </summary>
         /// <param name="blockId"></param>
         /// <param name="atts"></param>
         public static void AddAttsToBlocks(this ObjectId blockId, List<AttributeDefinition> atts)
         {
             Database db = blockId.Database;//获取数据库对象
             BlockTableRecord btr = blockId.GetObject(OpenMode.ForWrite) as BlockTableRecord;
             foreach (AttributeDefinition att in atts)
             {
                 btr.AppendEntity(att);
 
                 db.TransactionManager.AddNewlyCreatedDBObject(att, true);
             }
 
             btr.DowngradeOpen();
         }
 
         public static void AddAttsToBlocks(this ObjectId blockId, params AttributeDefinition[] atts)
         {
             blockId.AddAttsToBlocks(atts.ToList());
         }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

Menambahkan atribut ke definisi blok yang ditentukan. Kita bisa menggunakannya seperti ini:

 		//属性添加
        AttributeDefinition attr1 = new AttributeDefinition(Point3d.Origin, "箱变", "箱变编号", "请输入箱变编号", ObjectId.Null);
        AttributeDefinition attr2 = new AttributeDefinition(Point3d.Origin + new Vector3d(0, 0.25, 0),
            "变电站", "变电站编号", "请输入变电站编号", ObjectId.Null);
            
       //然后将这两个属性加入到集合,再调用上面的方法即可。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Deskripsi parameternya adalah sebagai berikut:

  • Posisi point3d: Ini adalah propertinyalokasi yang ditentukan , diberikan dalam bentuk koordinat tiga dimensi. Meskipun desain Anda bekerja pada bidang dua dimensi, Anda perlu memberikan titik koordinat tiga dimensi, dan nilai Z biasanya disetel ke 0.
  • nilai string: Ini ditentukan oleh atributnilai bawaan . Ketika blok dimasukkan, jika tidak ada nilai atribut tertentu yang diberikan, nilai default ini akan digunakan.
  • tag string: Ini ditentukan oleh atributLabel , yang merupakan pengidentifikasi uniknya. Ketika blok disisipkan, nilai atribut dapat direferensikan dan dimodifikasi melalui tag ini.
  • string prompt: Ini adalah atributPesan cepat , ketika pengguna perlu memasukkan nilai atribut saat memasukkan blok, pesan prompt ini akan ditampilkan. Ini dapat dikosongkan jika tidak diperlukan input pengguna.
  • Gaya ObjectId: Ini adalahID objek gaya font . Di AutoCAD, gaya font menentukan tampilan teks atribut, termasuk font, ukuran, rasio lebar, dll. Parameter ini harus berupa ID objek gaya font yang valid, jika tidak, pengecualian dapat diberikan.

2.3 Definisi blok dinamis

Definisi blok dinamis memerlukan penggunaan blok atribut.DynamicBlockReferencePropertyCollectionKelas menerapkan batasan pada properti.

3. Referensi blok (penyisipan blok)

3.1 Penyisipan blok biasa

public void Insert()
{
    Database db = HostApplicationServices.WorkingDatabase;
    using (Transaction trans = db.TransactionManager.StartTransaction())
    {
        BlockTable bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForRead);
        BlockTableRecord space = db.CurrentSpaceId.GetObject(OpenMode.ForWrite) as BlockTableRecord;
        //判断名为“块1”的块是否存在
        if(! bt["块1"].IsNull)
        {
            BlockReference br = new BlockReference(Point3d.Origin, bt["块1"]);
            br.ScaleFactors = new Scale3d(2.0);//设置尺寸为原来2倍
            space.AppendEntity(br);
            trans.AddNewlyCreatedDBObject(br, true);

            trans.Commit();
        }
        else
        {
            return;
        }        
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

3.2 Penyisipan blok atribut

Entitas atribut dalam referensi blok diwakili oleh kelas AttibuteReference di namespace DatabaseServices, yang sebenarnya merupakan objek teks satu baris yang diturunkan dari kelas DBText. Untuk menambahkan atribut ke referensi blok, ikuti langkah-langkah berikut:

  1. Buka objek rekaman tabel blok tempat referensi blok berada;
  2. Ulangi entitas dalam catatan tabel blok. Jika entitas adalah objek yang ditentukan oleh suatu atribut, tetapkan nilai atribut untuk objek atribut referensi blok sesuai dengan identifikasinya;
  3. Dapatkan objek kumpulan atribut dari objek referensi blok untuk menambahkan objek referensi atribut yang baru dibuat ke referensi blok. Objek kumpulan atribut diidentifikasi oleh atribut AttributeCollection dari BlockReference, dan memanggil fungsi AppendAttribute-nya dapat menyelesaikan penambahan atribut dari referensi blok.
/// <summary>
         /// 插入带属性的参照快
         /// </summary>
         /// <param name="spaceId">空间的ID</param>
         /// <param name="layer">块要加入的图层名</param>
         /// <param name="blockName">快参照所属的快名</param>
         /// <param name="postion">插入点</param>
         /// <param name="scale">缩放比例</param>
         /// <param name="rotateAngle">旋转角度</param>
         /// <param name="attNameValues">属性名称与取值</param>
         /// <returns></returns>
         public static ObjectId InsertBlockrefence(this ObjectId spaceId, string layer, string blockName, Point3d postion, Scale3d scale, double rotateAngle, Dictionary<string, string> attNameValues)
         {
             // 获取数据库对象
             Database db = spaceId.Database;
             //以读的方式打开块表
             BlockTable bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
             //如果没有blockName d的块,则程序返回
             if (!bt.Has(blockName))
 
                 return ObjectId.Null;//如果没有blockName的块,程序返回
             //以写的模式打开空间
             BlockTableRecord space = (BlockTableRecord)spaceId.GetObject(OpenMode.ForWrite);
             //获取块表的记录ID
             ObjectId btrId = bt[blockName];
             //打开块表记录
             BlockTableRecord record = btrId.GetObject(OpenMode.ForRead) as BlockTableRecord;
             //创建一个快参照并设置插入点
             BlockReference br = new BlockReference(postion, bt[blockName]);
 
             br.ScaleFactors = scale;
 
             br.Layer = layer;
             br.Rotation = rotateAngle;
 
             space.AppendEntity(br);
             //判断块表记录是否包含属性定义
             if (record.HasAttributeDefinitions)
             {
                 //若包含,则遍历属性定义
                 foreach (ObjectId id in record)
                 {
                     //检查是否是属性定义
                     AttributeDefinition attDef = id.GetObject(OpenMode.ForRead) as AttributeDefinition;
 
                     if (attDef != null)
                     {
 
                         //创建一个新的属性对象
                         AttributeReference attribute = new AttributeReference();
                         //从属性定义获取属性对象的对象特性
                         attribute.SetAttributeFromBlock(attDef, br.BlockTransform);
                         attribute.Rotation = attDef.Rotation;
 
                         attribute.Position = attDef.Position.TransformBy(br.BlockTransform);
 
                         attribute.AdjustAlignment(db);
                         //判断是否包含指定的属性名称
                         if (attNameValues.ContainsKey(attDef.Tag.ToUpper()))
                         {
                             //设置属性值
                             attribute.TextString = attNameValues[attDef.Tag.ToUpper()].ToString();
 
                         }
                         // 向块参照添加属性对象
                         br.AttributeCollection.AppendAttribute(attribute);
                         db.TransactionManager.AddNewlyCreatedDBObject(attribute, true);
 
                     }
                 }
             }
             db.TransactionManager.AddNewlyCreatedDBObject(br, true);
             return br.ObjectId;//返回添加的快参照的ID
         }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

Beberapa parameter di atas mungkin tidak diperlukan, seperti rasio penskalaan dan rasio penyisipan.

3.3 Modifikasi atribut

/// <summary>
         /// 更新属性名称与取值
         /// </summary>
         /// <param name="blockRefId"></param>
         /// <param name="attNameValues"></param>
         public static void UpdateAttributesInBlock(this ObjectId blockRefId, Dictionary<string, string> attNameValues)
         {
             BlockReference blockRef = blockRefId.GetObject(OpenMode.ForRead) as BlockReference;
             if (blockRef != null)
             {
                 foreach (ObjectId id in blockRef.AttributeCollection)
                 {
                     AttributeReference attref = id.GetObject(OpenMode.ForRead) as AttributeReference;
                     if (attNameValues.ContainsKey(attref.Tag.ToUpper()))
                     {
                         attref.UpgradeOpen();
                         //设置属性值
                         attref.TextString = attNameValues[attref.Tag.ToUpper()].ToString();
 
                         attref.DowngradeOpen();
                     }
                 }
 
             }
 
         }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26