प्रौद्योगिकी साझेदारी

CAD माध्यमिकविकास (12) - खण्डानां परिभाषा तथा उपयोगः

2024-07-12

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

खण्डाः CAD इत्यस्मिन् अतीव महत्त्वपूर्णः ज्ञानबिन्दुः अस्ति अद्य अहं भवद्भ्यः खण्डानां किञ्चित् वर्गीकरणं परिचयं च दास्यामि, तथैव खण्डानां परिभाषां सन्दर्भं च दास्यामि।

1. अवधारणा

१.१ खण्डपरिभाषा

खण्डः बहुभिः तार्किकरूपेण सम्बद्धैः चित्रात्मकैः वस्तुभिः परिभाषितः सत्ता अस्ति । लाभः अस्ति यत् एतत् कार्यमानकान् एकीकृत्य कार्यदक्षतां सुधारयितुम् अर्हति, यतः जीवने कश्चन वस्तु सरलः एककः नास्ति, परन्तु बहुभिः एककैः निर्मितः भवितुम् अर्हति खण्डाः एतस्याः संरचनायाः सम्यक् प्रतिनिधित्वं कर्तुं शक्नुवन्ति

खण्डस्य सारः खण्डसारणी अभिलेखेषु संगृहीतानाम् सत्तावस्तूनाम् सङ्ग्रहः भवति ।

१.२ गुणखण्डपरिभाषा

विशेषताखण्डाः गठितसत्ताभिः अतिरिक्तसूचनैः (गुणैः) च निर्मिताः भवन्ति श्रेणी। । विशिष्टानि कार्यान्वयनम् अन्तर्भवन्ति : १.

  1. AttributeDefinition वर्गस्य एकं उदाहरणं तथा च वस्तुनः विशेषतामूल्यं सेट् करोति;
  2. यतो हि खण्डस्य विशेषतापरिभाषा अपि खण्डे सत्तारूपेण गणनीया भवति, अतः विशेषतापरिभाषा खण्डसारणी अभिलेखवर्गस्य सदस्यकार्यस्य AppendEntity इत्यस्य माध्यमेन खण्डे संलग्नं कर्तुं शक्यते

तेषु विशेषताभिः परिभाषिताः विशेषतामूल्यानि मुख्यतया अन्तर्भवन्ति-

  • पाठस्य सम्मिलनबिन्दुः, ऊर्ध्वता, परिभ्रमणकोणः, संरेखणः, विस्तारः च;
  • विशेषतायाः पूर्वनिर्धारितं मूल्यम्;
  • विशेषताविधिः, यथा अदृश्यविधिः, अदृश्यविधिः, नित्यविधिः, नित्यविधिः, सत्यापनविधिः, सत्यापनविधिः, पूर्वनिर्धारितविधिः च, पूर्वनिर्धारितः;
  • विशेषता टैग नाम।

१.३ गतिशीलखण्डपरिभाषा

गतिशीलखण्डाः अस्मान् उच्चस्तरीयलचीलतायाः अनुकूलनक्षमतायाः च खण्डान् निर्मातुं शक्नुवन्ति । यतः एकदा पारम्परिकः खण्डः रेखाचित्रे प्रविष्टः भवति तदा तस्य आकारः, आकारः, स्थानं च प्रायः नियतं भवति । गतिशीलखण्डाः तु सम्पूर्णं खण्डं पुनः परिभाषितुं वा तस्य घटकान् मैन्युअल् रूपेण सम्पादयितुं वा विना उपयोक्तृ-अन्तरफलक-अन्तरक्रियायाः माध्यमेन (यथा क्रिया-हन्डल-कर्षणम्) स्वस्य ज्यामितीय-गुणान् समायोजयितुं शक्नुवन्ति

१.४ खण्डवर्गीकरणं कार्याणि च

खण्डाः मुख्यतया सरलखण्डाः, विशेषताखण्डाः, गतिशीलखण्डाः च इति विभक्ताः भवन्ति । खण्डानां कृते मुख्यतया खण्डपरिभाषाक्रियाः, खण्डसन्दर्भक्रियाः (अर्थात् खण्डप्रवेशक्रियाः), खण्डसम्पादनं च सन्ति ।

2. खण्डपरिभाषा

२.१ खण्डपरिभाषा

ते कीदृशाः खण्डाः न भवेयुः, तेषां परिभाषाः मोटेन समानाः सन्ति (विशेषणखण्डेषु विशेषतावस्तूनि योजयितुं आवश्यकाः सन्ति) ।

  1. block table ऑब्जेक्ट् प्राप्तुं Transaction क्लास् इत्यस्य GetObject() फंक्शन् इत्यस्य उपयोगं कुर्वन्तु;
  2. BlockTableRecord ऑब्जेक्ट् रचयन्तु तथा च ब्लॉक् नाम सेट् कुर्वन्तु;
  3. खण्डं निर्मायन्ते ये सत्तावस्तूनि रचयन्तु;
  4. BlockTableRecord वर्गस्य AppendEntity फंक्शन् आह्वयन्तु यत् ब्लॉकं निर्मायन्ते ये संस्थाः तान् ब्लॉक् टेबल् रिकार्ड् मध्ये लिखितुं;
  5. निर्मितं block table records वर्तमान रेखाचित्रस्य block table मध्ये लिखितुं BlockTable class इत्यस्य Add function इत्येतत् आह्वयन्तु ।

विशिष्टः कोडः यथा अस्ति ।

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

२.२ गुणखण्डपरिभाषा

उपरिष्टाद् केवलं सरलस्य खण्डस्य परिभाषा अस्ति यदा सन्दर्भ्यते)।
Property block definition, वयं तस्मिन् properties योजयित्वा properties योजयितुं शक्नुमः ।

		 /// <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 position: एषः गुणः अस्तिपरिभाषितं स्थानं , त्रिविमनिर्देशाङ्करूपेण दत्तः । यदि भवतः डिजाइनः द्वि-आयामी-विमानस्य उपरि कार्यं करोति चेदपि, भवतः त्रि-आयामी समन्वय-बिन्दुः प्रदातव्यः, तथा च Z मूल्यं प्रायः 0 इति सेट् भवति ।
  • string value: एतत् विशेषणेन परिभाषितम् अस्तिपूर्वनिर्धारितं मूल्यम् . यदा खण्डः सम्मिलितः भवति तदा यदि विशिष्टं विशेषतामूल्यं न प्रदत्तं तर्हि एतत् पूर्वनिर्धारितं मूल्यं उपयुज्यते ।
  • string tag: एतत् विशेषणेन परिभाषितम् अस्तिनामपत्र , यः तस्य अद्वितीयपरिचयः अस्ति । यदा खण्डः सम्मिलितः भवति तदा अस्य टैग् इत्यस्य माध्यमेन विशेषतामूल्यं सन्दर्भयितुं परिवर्तयितुं च शक्यते ।
  • string prompt: एतत् विशेषता अस्तिप्रॉम्प्ट सन्देश , यदा उपयोक्त्रेण खण्डं सम्मिलितं कुर्वन् विशेषतामूल्यं प्रविष्टुं आवश्यकं भवति तदा एषः प्रॉम्प्ट् सन्देशः प्रदर्शितः भविष्यति । यदि उपयोक्तृनिवेशस्य आवश्यकता नास्ति तर्हि एतत् रिक्तं त्यक्तुं शक्यते ।
  • ObjectId शैली: एषा अस्तिफन्ट् शैल्याः ऑब्जेक्ट् ID . AutoCAD इत्यस्मिन् font style इत्यनेन विशेषतापाठस्य स्वरूपं निर्धारितं भवति, यत्र font, size, width ratio इत्यादयः सन्ति । इदं पैरामीटर् वैधस्य font style object इत्यस्य ID भवितुमर्हति, अन्यथा अपवादः क्षिप्तः भवितुम् अर्हति ।

२.३ गतिशीलखण्डपरिभाषा

गतिशीलखण्डानां परिभाषायां विशेषताखण्डानां उपयोगः आवश्यकः भवति ।DynamicBlockReferencePropertyCollectionवर्गाः गुणानाम् उपरि बाधाः आरोपयन्ति ।

3. खण्डसन्दर्भः (खण्डप्रवेशः) २.

३.१ साधारणः खण्डप्रवेशः

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

३.२ विशेषताखण्डप्रवेशः

ब्लॉकसन्दर्भे विशेषतासत्ता DatabaseServices नामस्थाने AttibuteReference वर्गेन प्रतिनिधिता भवति, यत् वस्तुतः DBText वर्गात् व्युत्पन्नं एकपङ्क्तिपाठवस्तु अस्ति ब्लॉकसन्दर्भे विशेषताः योजयितुं एतानि पदानि अनुसृत्य कार्यं कुर्वन्तु ।

  1. block table record object उद्घाटयन्तु यस्य block reference अस्ति;
  2. ब्लॉक सारणी अभिलेखे सत्तानां माध्यमेन लूपं कुर्वन्तु यदि सत्ता विशेषणेन परिभाषितं वस्तु अस्ति, तर्हि तस्य परिचयानुसारं खण्डसन्दर्भविशेषतावस्तुनः कृते विशेषतामूल्यं सेट् कुर्वन्तु
  3. नवनिर्मितं विशेषतासन्दर्भवस्तुं खण्डसन्दर्भे योजयितुं block reference object इत्यस्य attribute collection object प्राप्तव्यम् । विशेषतासङ्ग्रहवस्तु BlockReference इत्यस्य AttributeCollection विशेषणेन चिह्नितं भवति, तस्य 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

उपर्युक्तेषु केषाञ्चन मापदण्डानां आवश्यकता न भवेत्, यथा स्केलिंग् रेश्यो, इन्सर्शन रेश्यो च ।

३.३ विशेषतासंशोधनम्

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