Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > C# AutoCAD. Как сделать многострочный атрибут?

C# AutoCAD. Как сделать многострочный атрибут?

Ответ
Поиск в этой теме
Непрочитано 15.09.2013, 02:46 #1
C# AutoCAD. Как сделать многострочный атрибут?
Sfinks7s1
 
VB, C++, C#, Java
 
Санкт-Петербург
Регистрация: 19.04.2013
Сообщений: 48

Есть функция, которая создаёт атрибуты с определёнными именами и текстом. Требуется создать многострочный атрибут и что-то не пойму как. Многострочный текст создать не проблема, но нужно чтобы это был именно атрибут.
Если кто сможет, пожалуйста направьте по ссылке или подскажите как это реализуется.

Код:
[Выделить все]
using (Transaction trAdding = dbCurrent.TransactionManager.StartTransaction())
                    {
                        BlockTable btTable = (BlockTable)trAdding.GetObject(dbCurrent.BlockTableId, OpenMode.ForRead);
                        string strBlockName = "ATTRBLK" + System.Convert.ToString(blockName);
                        try
                        {
                            if (btTable.Has(strBlockName))
                                edCurrent.WriteMessage("\n A block with this name already exist.");
                        }
                        catch
                        {
                            edCurrent.WriteMessage("\n Invalid block name.");
                        }

                        
                        AttributeDefinition adAttr = new AttributeDefinition();
                        adAttr.Position = new Point3d(x, y, 0);
                        adAttr.WidthFactor = widthFactor;
                        adAttr.Height = height;
                        adAttr.Rotation = rotate;
                        adAttr.Oblique = oblique;

                        adAttr.Tag = attrName;

                        BlockTableRecord btrRecord = new BlockTableRecord();
                        btrRecord.Name = strBlockName;
                        btTable.UpgradeOpen();

                        ObjectId btrID = btTable.Add(btrRecord);

                        trAdding.AddNewlyCreatedDBObject(btrRecord, true);

                        btrRecord.AppendEntity(adAttr);
                        trAdding.AddNewlyCreatedDBObject(adAttr, true);

                        BlockTableRecord btrPapperSpace = (BlockTableRecord)trAdding.GetObject(btTable[BlockTableRecord.PaperSpace], OpenMode.ForWrite);

                        BlockReference brRefBlock = new BlockReference(Point3d.Origin, btrID);

                        btrPapperSpace.AppendEntity(brRefBlock);
                        trAdding.AddNewlyCreatedDBObject(brRefBlock, true);

                        //задаём значение атрибута
                        AttributeReference arAttr = new AttributeReference();
                        arAttr.SetAttributeFromBlock(adAttr, brRefBlock.BlockTransform);

                        arAttr.TextString = text;
                        arAttr.Layer = "Z-TEXT";

                        brRefBlock.AttributeCollection.AppendAttribute(arAttr);


                        trAdding.AddNewlyCreatedDBObject(arAttr, true);

                        trAdding.Commit();
                    }
Просмотров: 4386
 
Непрочитано 15.09.2013, 10:14
#2
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Код:
[Выделить все]
Public Class acad__boxashu
    <CommandMethod("bx_matt")> _
    Public Sub bx_matt()
        Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
        Dim acCurDb As Database = acDoc.Database
        Dim acEd As Editor = acDoc.Editor
        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
            Dim opt As PromptEntityOptions = New PromptEntityOptions(ControlChars.CrLf & "Block: ")
            Dim res As PromptEntityResult = acEd.GetEntity(opt)
            If res.Status <> PromptStatus.OK Then
                Exit Sub
            End If
            Dim acEnt As Entity = CType(acTrans.GetObject(res.ObjectId, _
                                                    OpenMode.ForRead), Entity)
            If Not IsDBNull(acEnt) Then
                If TypeOf acEnt Is BlockReference Then
                    Dim acBlock As BlockReference = CType(acEnt, BlockReference)
                    If acBlock.IsDynamicBlock Then
                        Dim blr As BlockTableRecord = CType(acTrans.GetObject(acBlock.DynamicBlockTableRecord, _
                                                                           OpenMode.ForRead), BlockTableRecord)
                        If blr.HasAttributeDefinitions Then
                            For Each idAtt As ObjectId In acBlock.AttributeCollection
                                Dim obj As DBObject = acTrans.GetObject(idAtt, OpenMode.ForRead)
                                If TypeOf obj Is AttributeReference Then
                                    Dim attRef As AttributeReference = CType(obj, AttributeReference)
                                    attRef.UpgradeOpen()
                                    attRef.IsMTextAttribute = True
                                    attRef.DowngradeOpen()
                                End If
                            Next
                        End If
                    End If
                End If
            End If
            acTrans.Commit()
        End Using
    End Sub
End Class
Boxa на форуме  
 
Непрочитано 15.09.2013, 16:47
#3
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Воха
А вопрос не по теме, чисто из любопытства, почему ты в Тру не оборачиваешь транзакцию.
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 16.09.2013, 06:43
#4
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Offtop:
1. Потому что это пример. =о)
2. Я хочу знать, когда я допустил ошибку и почему.
3. Я не совсем согласен, но мне близка эта точка зрения
4. А вот что по этому поводу "говорят" в автодеске ссылка

Последний раз редактировалось Boxa, 16.09.2013 в 07:32.
Boxa на форуме  
 
Непрочитано 16.09.2013, 16:00
#5
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


многострочный атрибут лучше не создавать. это = (кол-во проблем Mtext)^2
Sleekka вне форума  
 
Непрочитано 17.09.2013, 14:22
#6
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Пробуй лучше таким макаром:
Код:
[Выделить все]
        [CommandMethod("Bma")]
        public  void testMultAttribute()
        {
            var docCurrent = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            var dbCurrent = docCurrent.Database;

            var edCurrent = docCurrent.Editor;

            BlockTableRecord btrRecord = null;

            string blockName = "";double x=0;double y=0;double z=0;

            double widthFactor = 1.0; double height = 250; double rotate = 0.0; double oblique = 0.0;

            string attrName = "ATTTAG";string text="first text line\\Psecond text line\\Pthird text line";

            ObjectId btrID = ObjectId.Null;
            try
            {
                docCurrent.TransactionManager.EnableGraphicsFlush(true);

            using (Transaction trAdding = dbCurrent.TransactionManager.StartTransaction())
            {
                BlockTable btTable = (BlockTable)trAdding.GetObject(dbCurrent.BlockTableId, OpenMode.ForRead);

                string strBlockName = "ATTRBLK" + System.Convert.ToString(blockName);

                try
                {
                    if (btTable.Has(strBlockName))

                        edCurrent.WriteMessage("\n A block with this name already exist.");

                    else
                    {
                    
                AttributeDefinition adAttr = new AttributeDefinition();  
       
                adAttr.Position = new Point3d(x, y, z);

                adAttr.WidthFactor = widthFactor;

                adAttr.Height = height;

                adAttr.Rotation = rotate;

                adAttr.Oblique = oblique;

                adAttr.Tag = attrName;
               
                btTable.UpgradeOpen();

                btrRecord = new BlockTableRecord();

                btrRecord.Name = strBlockName;

                btTable.Add(btrRecord);

                trAdding.AddNewlyCreatedDBObject(btrRecord, true);

                btTable.DowngradeOpen();

                adAttr.IsMTextAttributeDefinition = true;

                adAttr.MTextAttributeDefinition.Contents = text;

                btrRecord.AppendEntity(adAttr);

                trAdding.AddNewlyCreatedDBObject(adAttr, true);

                    }
                }
                catch
                {
                    edCurrent.WriteMessage("\n Invalid block name.");
                }

                BlockTableRecord btrPapperSpace = (BlockTableRecord)trAdding.GetObject(btTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite);

                BlockReference brRefBlock = new BlockReference(new Point3d(x, y, z), btrRecord.ObjectId);

                btrPapperSpace.AppendEntity(brRefBlock);

                trAdding.AddNewlyCreatedDBObject(brRefBlock, true);

                //задаём значение атрибута
              
                foreach (ObjectId id in btrRecord)
                {

                    DBObject obj = id.GetObject(OpenMode.ForRead);

                    AttributeDefinition adAttr = obj as AttributeDefinition;

                    if ((adAttr != null) && (!adAttr.Constant))
                    {
                        AttributeReference arAttr = new AttributeReference();

                        arAttr.SetAttributeFromBlock(adAttr, brRefBlock.BlockTransform);

                        if (arAttr.IsMTextAttribute)
                        {
                  
                            arAttr.Layer = "0";

                            arAttr.TextString = text;

                            arAttr.UpdateMTextAttribute();

                            brRefBlock.RecordGraphicsModified(true);
                        }
                        else
                        {
                            // add usual attribute reference here
                        }

                        brRefBlock.AttributeCollection.AppendAttribute(arAttr);

                        trAdding.AddNewlyCreatedDBObject(arAttr, true);
                    }
                    
                    trAdding.TransactionManager.QueueForGraphicsFlush();
                }

                docCurrent.TransactionManager.FlushGraphics();

                trAdding.Commit();

               }
            }
             catch (System.Exception ex)
             {
                 edCurrent.WriteMessage("\n{0}\n{1}", ex.Message, ex.StackTrace);
             }
             finally
             {
                 Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\n\t---\tSee results\t---\n");
             }
        }
Олег (jr.) вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > C# AutoCAD. Как сделать многострочный атрибут?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка ПОС, искусство проектирования Tyhig Технология и организация строительства 117 25.11.2021 17:38
Как сделать спецификацию на площади здания в AutoCad Nadezzda Прочее. Программное обеспечение 6 30.06.2012 15:55
AutoCad Civil 3D 2012 Русский SP1 Как сделать откос перпендикулярным кромке? Atatushnik Вертикальные решения на базе AutoCAD 2 02.04.2012 10:59
Можно ли создать многострочный атрибут блока, который будет динамически растягиваться? ACAD 2007. Vavapet Динамические блоки 2 01.03.2011 15:00
Как сделать врезку между двумя трубопроводами в AutoCAD MEP 2011? ilbin Вертикальные решения на базе AutoCAD 2 19.10.2010 16:35