Записать в атрибут блока как поле field

Автор Тема: Записать в атрибут блока как поле field  (Прочитано 4262 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн YusufАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 4
Добрый день, коллеги.
Подскажите пожалуйста, как можно в атрибут блока с названиями X и Y программно записать позиции X и Y центра окружности, который тоже в этом же блоке.
Надо проставить в точках полининии блок в котором есть координаты в виде X и Y, они берутся от центра окружности. Блок в точках полилинии проставляю, не могу записать id окружности в поле (Field) ручную все работает не могу записать программно.
Подскажите как реализовать? Ниже привожу код
      
Код - C# [Выбрать]
  1.                 [CommandMethod("AttributeField")]
  2.                 public void WriteToAttributeField()
  3.                 {
  4.                         var doc =
  5.                                 Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument;
  6.                         var ed = doc.Editor;
  7.                         var db = doc.Database;
  8.  
  9.                         string blockName = "Опора 2";
  10.                         TypedValue[] filList = new TypedValue[2]
  11.                         {
  12.                                 new TypedValue((int)DxfCode.Start, "INSERT"),
  13.                                 new TypedValue((int)DxfCode.BlockName, blockName)
  14.                         };
  15.  
  16.                         SelectionFilter filter = new SelectionFilter(filList);
  17.                         var idArray = ed.SelectAll(filter).Value.GetObjectIds();
  18.  
  19.                         using (Transaction trx = db.TransactionManager.StartTransaction())
  20.                         {
  21.                                 foreach (var blockId in idArray)
  22.                                 {
  23.                                         BlockReference bref = trx.GetObject(blockId, OpenMode.ForWrite) as BlockReference;
  24.                                         BlockTableRecord btr = (BlockTableRecord)trx.GetObject(bref.BlockTableRecord, OpenMode.ForWrite);
  25.                                         foreach (ObjectId id in btr)
  26.                                         {
  27.                                                 DBObject obj = id.GetObject(OpenMode.ForWrite);
  28.                                                 //AttributeDefinition attDef = obj as AttributeDefinition;
  29.                                                 if (id.ObjectClass.DxfName == "CIRCLE")
  30.                                                 {
  31.                                                         var str = blockId.ToString();
  32.                                                         char[] circleStr = { '(', ')' };
  33.                                                         str.Trim(circleStr);
  34.  
  35.                                                         AttributeCollection attCol = bref.AttributeCollection;
  36.                                                         foreach (ObjectId attId in attCol)
  37.                                                         {
  38.                                                                 using (AttributeReference attRef = (AttributeReference)trx.GetObject(attId, OpenMode.ForWrite))
  39.                                                                 {
  40.                                                                         ed.WriteMessage("\n  Attribute Tag: " + attRef.Tag + "\n    Attribute String: " + attRef.TextString);
  41.  
  42.                                                                         if (attRef.Tag == "X")
  43.                                                                         {
  44.                                                                                 attRef.UpgradeOpen();
  45.                                                                                 //attRef.SetAttributeFromBlock(, blockRef.BlockTransform);
  46.                                                                                 attRef.TextString =
  47.                                                                                         $"X = %<\\AcObjProp.16.2 Object(%<\\_ObjId {str}>%,1).Center \\f \"%lu6%pt1\">%";
  48.                                                                                 ed.WriteMessage($"в {attRef.Tag} c id {attRef.Id} записано X = %<\\AcObjProp.16.2 Object(%<\\_ObjId {str}>%,1).Center \\f \"%lu6%pt1\">%");
  49.                                                                         }
  50.                                                                         else if (attRef.Tag == "Y")
  51.                                                                         {
  52.                                                                                 attRef.UpgradeOpen();
  53.                                                                                 //attRef.SetAttributeFromBlock(attDef, blockRef.BlockTransform);
  54.                                                                                 attRef.TextString =
  55.                                                                                         $"Y = %<\\AcObjProp.16.2 Object(%<\\_ObjId {str}>%,1).Center \\f \"%lu6%pt2\">%";
  56.                                                                                 ed.WriteMessage($"в {attRef.Tag} c id {attRef.Id} записано Y = %<\\AcObjProp.16.2 Object(%<\\_ObjId {str}>%,1).Center \\f \"%lu6%pt2\">%");
  57.                                                                         }
  58.                                                                         //bref.AttributeCollection.AppendAttribute(attRef);
  59.                                                                         //trx.AddNewlyCreatedDBObject(attRef, true);
  60.                                                                 }
  61.                                                         }
  62.                                                         ed.WriteMessage($"circle id {str}\n");
  63.                                                 }
  64.  
  65.                                         }
  66.                                 }
  67.                                 trx.Commit();
  68.                         }
  69.                 }
  70.  

Оффлайн YusufАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 4
Коллеги, может не смог объяснить что я хочу, никто разве не сталкивался?
Какое id писать в поле id BlockDefinition или Blockreference? В ручную когда создаем поле в атрибуте в редакторе блока, если указываем объект в поле то он же берет id BlockDefinition, получается при вставке блока тоже надо указывать id BlockDefinition ?
Вообще,  если просто понасоздавать программно настроенный блок с координатами он же должен показывать координаты?

Отмечено как Решение Yusuf 28-07-2023, 14:51:38

Оффлайн alz

  • ADN OPEN
  • **
  • Сообщений: 93
  • Карма: 11
Мне кажется смысла в этом мало, центр окружности будет определяться в системе координат блока, то есть будет всегда одинаковым, если нужны координаты в поле по идее надо добавлять ObjectId конкретного BlockReference, координаты которого и будет отображать поле, ну а как правильно записать поле в атрибут можно посмотреть тут:
https://adndevblog.typepad.com/autocad/2016/07/adding-field-to-attribute-value-of-a-block-inserted-to-modelspace.html

Оффлайн YusufАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 4
Мне кажется смысла в этом мало, центр окружности будет определяться в системе координат блока, то есть будет всегда одинаковым, если нужны координаты в поле по идее надо добавлять ObjectId конкретного BlockReference, координаты которого и будет отображать поле, ну а как правильно записать поле в атрибут можно посмотреть тут:
https://adndevblog.typepad.com/autocad/2016/07/adding-field-to-attribute-value-of-a-block-inserted-to-modelspace.html
спасибо то что надо, почему не смог сам найти, вроде все перерыл