22/07/2016
Добавление полей к атрибутам блока, вставленными в пространство модели
Вот статья, которая объясняет, как вставить блок с атрибутами.
Ниже C#-код, вставляющий поле (field) в атрибут блока. Создайте чертеж с блоком с именем "test" содержащий окружность (Circle) и определение атрибута с произвольным именем для тестирования кода.
Код - C#: [Выделить]
- [CommandMethod("addFieldToAttribute")]
- public void addFieldToAttribute()
- {
- Database db = Application.DocumentManager.MdiActiveDocument.Database;
- Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
- string blkName = "test";
- using (Transaction acTrans = db.TransactionManager.StartTransaction())
- {
- BlockTable blkTbl = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
- if (blkTbl.Has(blkName))
- {
- BlockTableRecord blkTblRec = blkTbl[blkName].GetObject(OpenMode.ForRead)
- as BlockTableRecord;
- using (BlockReference blkRef = new BlockReference(Point3d.Origin, blkTblRec.ObjectId))
- {
- BlockTableRecord ms = blkTbl[BlockTableRecord.ModelSpace].GetObject(OpenMode.ForWrite)
- as BlockTableRecord;
- ms.AppendEntity(blkRef);
- acTrans.AddNewlyCreatedDBObject(blkRef, true);
- if (blkTblRec.HasAttributeDefinitions)
- {
- Point3d cp = new Point3d(0, 0, 0);
- Circle circ = new Circle();
- ObjectId objID = new ObjectId();
- foreach (ObjectId id in blkTblRec)
- {
- DBObject obj = id.GetObject(OpenMode.ForRead);
- if ((obj) is Circle)
- {
- circ = (Circle)obj; // Получаем объект окружности
- cp = circ.Center;
- objID = circ.ObjectId;
- }
- if (obj is AttributeDefinition)
- {
- AttributeDefinition acAttDef = (AttributeDefinition)obj;
- // Создаём новый AttributeReference
- using (AttributeReference acAttRef = new AttributeReference())
- {
- acAttRef.SetAttributeFromBlock(acAttDef, blkRef.BlockTransform);
- acAttRef.Position = acAttDef.Position.TransformBy(blkRef.BlockTransform);
- acAttRef.TextString = acAttDef.TextString;
- acAttRef.Tag = acAttDef.Tag;
- // Добавляем AttributeReference к BlockReference
- blkRef.AttributeCollection.AppendAttribute(acAttRef);
- // Назначаем точку центра в качестве кода поля
- string str1 = "%<\\AcObjProp.16.2 Object(%<\\_ObjId ";
- string strID = objID.OldIdPtr.ToString();
- string str2 = ">%,1).Center \\f \"%lu2\">%";
- string str = str1 + strID + str2;
- string fldstr = string.Format(str, cp.ToString());
- // Создаём новое поле
- Field field = new Field(fldstr);
- field.Evaluate();
- FieldEvaluationStatusResult fieldEval = field.EvaluationStatus;
- if (fieldEval.Status != FieldEvaluationStatus.Success)
- {
- acTrans.Abort();
- ed.WriteMessage(string.Format("FieldEvaluationStatus сообщение: {0} - {1}",
- fieldEval.Status, fieldEval.ErrorMessage));
- return;
- }
- else
- {
- try
- { // Устанавливаем вставке атрибута значение поля
- acAttRef.SetField(field);
- acTrans.AddNewlyCreatedDBObject(field, true);
- ed.WriteMessage(string.Format("Поле ({1}) вставлено в атрибут '{0}' блока '{2}' ",
- acAttRef.Tag, field.Value, blkRef.Name));
- }
- catch
- {
- field.Dispose();
- ed.WriteMessage(string.Format("Ошибка при установке поля атрибуту '{0}' - {1}",
- acAttRef.Tag, acAttRef.Handle));
- }
- }
- acTrans.AddNewlyCreatedDBObject(acAttRef, true);
- }
- }
- }
- }
- }
- }
- acTrans.Commit();
- }
- }
Автор перевода: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=7233
Опубликовано 22.07.2016