Κοινή χρήση τεχνολογίας

Δευτερεύουσα ανάπτυξη CAD (12) - Ορισμός και χρήση μπλοκ

2024-07-12

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

Τα μπλοκ είναι ένα πολύ σημαντικό σημείο γνώσης στο CAD Σήμερα θα σας δώσω κάποια ταξινόμηση και εισαγωγή των μπλοκ, καθώς και τον ορισμό και την αναφορά των μπλοκ.

1. Έννοια

1.1 Ορισμός μπλοκ

Ένα μπλοκ είναι μια οντότητα που ορίζεται από πολλά λογικά σχετιζόμενα γραφικά αντικείμενα. Το πλεονέκτημα είναι ότι μπορεί να ενοποιήσει τα πρότυπα εργασίας και να βελτιώσει την αποδοτικότητα της εργασίας, επειδή ένα αντικείμενο στη ζωή δεν είναι μια απλή μονάδα, αλλά μπορεί να αποτελείται από πολλαπλές μονάδες.

Η ουσία ενός μπλοκ είναι μια συλλογή αντικειμένων οντοτήτων που είναι αποθηκευμένα σε εγγραφές πίνακα μπλοκ.

1.2 Ορισμός μπλοκ ιδιοτήτων

Τα μπλοκ χαρακτηριστικών αποτελούνται από συγκροτημένες οντότητες και πρόσθετες πληροφορίες (χαρακτηριστικά) Ο ορισμός των μπλοκ σε ένα μπλοκ χαρακτηριστικών είναι ο ίδιος με αυτόν σε ένα απλό μπλοκ και ο ορισμός των χαρακτηριστικών επιτυγχάνεται κυρίως μέσω των σχετικών χαρακτηριστικών και συναρτήσεων του χαρακτηριστικού AttributeDefinition. τάξη. Οι συγκεκριμένες υλοποιήσεις περιλαμβάνουν:

  1. Ένα στιγμιότυπο της κλάσης AttributeDefinition και ορίζει την τιμή του χαρακτηριστικού του αντικειμένου.
  2. Εφόσον ο ορισμός του χαρακτηριστικού ενός μπλοκ μπορεί επίσης να θεωρηθεί ως οντότητα στο μπλοκ, ο ορισμός του χαρακτηριστικού μπορεί να προσαρτηθεί στο μπλοκ μέσω της συνάρτησης μέλους AppendEntity της κλάσης εγγραφών του πίνακα μπλοκ.

Μεταξύ αυτών, οι τιμές χαρακτηριστικών που ορίζονται από χαρακτηριστικά περιλαμβάνουν κυρίως:

  • Το σημείο εισαγωγής, το ύψος, η γωνία περιστροφής, η στοίχιση και το πλάτος του κειμένου.
  • Η προεπιλεγμένη τιμή του χαρακτηριστικού.
  • Λειτουργία χαρακτηριστικών, όπως αόρατη λειτουργία, αόρατη λειτουργία, σταθερή λειτουργία, σταθερή λειτουργία, λειτουργία επαλήθευσης, λειτουργία επαλήθευσης και προκαθορισμένη λειτουργία, προεπιλογή.
  • Όνομα ετικέτας χαρακτηριστικού.

1.3 Ορισμός δυναμικού μπλοκ

Τα δυναμικά μπλοκ μας επιτρέπουν να δημιουργήσουμε μπλοκ με υψηλό βαθμό ευελιξίας και δυνατότητας προσαρμογής. Επειδή όταν ένα παραδοσιακό μπλοκ εισάγεται σε ένα σχέδιο, το μέγεθος, το σχήμα και η θέση του συνήθως καθορίζονται. Τα δυναμικά μπλοκ, από την άλλη πλευρά, μπορούν να προσαρμόσουν τις γεωμετρικές τους ιδιότητες μέσω της αλληλεπίδρασης της διεπαφής χρήστη (όπως η μεταφορά λαβών ενεργειών) χωρίς να χρειάζεται να επαναπροσδιορίσουν ολόκληρο το μπλοκ ή να επεξεργαστούν μη αυτόματα τα στοιχεία του.

1.4 Ταξινόμηση και λειτουργίες μπλοκ

Τα μπλοκ χωρίζονται κυρίως σε απλά μπλοκ, μπλοκ χαρακτηριστικών και δυναμικά μπλοκ. Για τα μπλοκ, υπάρχουν κυρίως λειτουργίες ορισμού μπλοκ, λειτουργίες αναφοράς μπλοκ (δηλαδή λειτουργίες εισαγωγής μπλοκ) και επεξεργασία μπλοκ.

2. Ορισμός μπλοκ

2.1 Ορισμός μπλοκ

Ανεξάρτητα από το είδος του μπλοκ, οι ορισμοί τους είναι περίπου οι ίδιοι (τα μπλοκ χαρακτηριστικών πρέπει να προσθέσουν αντικείμενα χαρακτηριστικών Τα συγκεκριμένα βήματα είναι τα εξής:

  1. Χρησιμοποιήστε τη συνάρτηση GetObject() της κλάσης Transaction για να αποκτήσετε το αντικείμενο του πίνακα μπλοκ.
  2. Δημιουργήστε ένα αντικείμενο BlockTableRecord και ορίστε το όνομα του μπλοκ.
  3. Δημιουργήστε τα αντικείμενα οντοτήτων που αποτελούν το μπλοκ.
  4. Καλέστε τη συνάρτηση AppendEntity της κλάσης BlockTableRecord για να γράψετε τις οντότητες που απαρτίζουν το μπλοκ στην εγγραφή του πίνακα μπλοκ.
  5. Καλέστε τη συνάρτηση Προσθήκη της κλάσης BlockTable για να γράψετε τις δημιουργημένες εγγραφές του πίνακα μπλοκ στον πίνακα μπλοκ του τρέχοντος σχεδίου.

Ο συγκεκριμένος κωδικός είναι ο εξής:

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 Ορισμός μπλοκ ιδιοτήτων

Τα παραπάνω είναι απλώς ο ορισμός ενός απλού μπλοκ Για μπλοκ χαρακτηριστικών, όπως υποδηλώνει το όνομα, πρέπει να ορίσετε τα πεδία χαρακτηριστικών στο μπλοκ (μπορούμε να το κατανοήσουμε ως καθορισμό μεταβλητών χαρακτηριστικών, οι οποίες πρέπει να μετατραπούν σε συγκεκριμένες τιμές μεταβλητών. όταν αναφέρεται).
Ορισμός μπλοκ ιδιοτήτων, μπορούμε να προσθέσουμε ιδιότητες σε αυτό προσθέτοντας ιδιότητες.

		 /// <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

Προσθέτει χαρακτηριστικά στον καθορισμένο ορισμό μπλοκ. Μπορούμε να το χρησιμοποιήσουμε ως εξής:

 		//属性添加
        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

Η περιγραφή παραμέτρων έχει ως εξής:

  • Θέση Point3d: Αυτή είναι η ιδιοκτησίακαθορισμένη τοποθεσία , που δίνεται με τη μορφή τρισδιάστατων συντεταγμένων. Ακόμα κι αν το σχέδιό σας λειτουργεί σε ένα δισδιάστατο επίπεδο, πρέπει να παρέχετε ένα τρισδιάστατο σημείο συντεταγμένων και η τιμή Z συνήθως ορίζεται στο 0.
  • τιμή συμβολοσειράς: Αυτό ορίζεται από το χαρακτηριστικόΠροεπιλεγμένη τιμή . Όταν εισάγεται το μπλοκ, εάν δεν παρέχεται συγκεκριμένη τιμή χαρακτηριστικού, χρησιμοποιείται αυτή η προεπιλεγμένη τιμή.
  • ετικέτα συμβολοσειράς: Αυτό ορίζεται από το χαρακτηριστικόΕπιγραφή , που είναι το μοναδικό του αναγνωριστικό. Όταν εισάγεται το μπλοκ, η τιμή του χαρακτηριστικού μπορεί να γίνει αναφορά και να τροποποιηθεί μέσω αυτής της ετικέτας.
  • Προτροπή συμβολοσειράς: Αυτό είναι ένα χαρακτηριστικόΠροειδοποιητικό μήνυμα , όταν ο χρήστης χρειάζεται να εισαγάγει μια τιμή χαρακτηριστικού κατά την εισαγωγή ενός μπλοκ, θα εμφανιστεί αυτό το μήνυμα προτροπής. Αυτό μπορεί να μείνει κενό εάν δεν απαιτείται εισαγωγή χρήστη.
  • Στυλ ObjectId: Αυτό είναιΤο αναγνωριστικό αντικειμένου του στυλ γραμματοσειράς . Στο AutoCAD, το στυλ γραμματοσειράς καθορίζει την εμφάνιση του κειμένου χαρακτηριστικών, συμπεριλαμβανομένης της γραμματοσειράς, του μεγέθους, της αναλογίας πλάτους κ.λπ. Αυτή η παράμετρος πρέπει να είναι το αναγνωριστικό ενός έγκυρου αντικειμένου στυλ γραμματοσειράς, διαφορετικά μπορεί να γίνει εξαίρεση.

2.3 Ορισμός δυναμικού μπλοκ

Ο ορισμός των δυναμικών μπλοκ απαιτεί τη χρήση μπλοκ χαρακτηριστικών.DynamicBlockReferencePropertyCollectionΟι κλάσεις επιβάλλουν περιορισμούς στις ιδιότητες.

3. Αναφορά μπλοκ (εισαγωγή μπλοκ)

3.1 Συνήθης εισαγωγή μπλοκ

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 Εισαγωγή μπλοκ χαρακτηριστικών

Η οντότητα χαρακτηριστικού στην αναφορά μπλοκ αντιπροσωπεύεται από την κλάση AttibuteReference στον χώρο ονομάτων DatabaseServices, που είναι στην πραγματικότητα ένα αντικείμενο κειμένου μιας γραμμής που προέρχεται από την κλάση DBText. Για να προσθέσετε χαρακτηριστικά σε μια αναφορά μπλοκ, ακολουθήστε τα εξής βήματα:

  1. Ανοίξτε το αντικείμενο εγγραφής του πίνακα μπλοκ στο οποίο ανήκει η αναφορά μπλοκ.
  2. Κάντε βρόχο μέσω των οντοτήτων στην εγγραφή του πίνακα μπλοκ Εάν η οντότητα είναι ένα αντικείμενο που ορίζεται από ένα χαρακτηριστικό, ορίστε την τιμή χαρακτηριστικού για το αντικείμενο του χαρακτηριστικού αναφοράς μπλοκ σύμφωνα με την αναγνώρισή του.
  3. Λάβετε το αντικείμενο συλλογής χαρακτηριστικών του αντικειμένου αναφοράς μπλοκ για να προσθέσετε το αντικείμενο αναφοράς χαρακτηριστικών που δημιουργήθηκε πρόσφατα στην αναφορά μπλοκ. Το αντικείμενο συλλογής χαρακτηριστικών προσδιορίζεται από το χαρακτηριστικό AttributeCollection του BlockReference και η κλήση της συνάρτησης AppendAttribute μπορεί να ολοκληρώσει την προσθήκη χαρακτηριστικών της αναφοράς μπλοκ.
/// <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

Ορισμένες από τις παραπάνω παραμέτρους μπορεί να μην χρειάζονται, όπως η αναλογία κλιμάκωσης και η αναλογία εισαγωγής.

3.3 Τροποποίηση χαρακτηριστικών

/// <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