Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Denis от 10-07-2015, 13:51:17

Название: Двойной клик по блоку на чертеже.
Отправлено: Denis от 10-07-2015, 13:51:17
Здравствуйте.
Возник вопрос: почему-то один блок при двойном клике на нем открывает Enhanced Attribute Editor, а другой ( который автоматически генерится из базы данных при помощи .Net) в Edit Block Definitions. Хотелось бы понять, как сделать так,чтобы второй тоже открывался в Enhanced Attribute Editor.


Название: Re: Двойной клик по блоку на чертеже.
Отправлено: Александр Пекшев aka Modis от 10-07-2015, 13:55:50
Это даже с программированием не связано)) Редактор атрибутов автоматом открывается, когда в блоке есть редактируемые атрибуты. Редактор блоков, соответственно, когда атрибутов нет
Название: Re: Двойной клик по блоку на чертеже.
Отправлено: Denis от 10-07-2015, 14:04:40
Это связано с программированием тем,что блок,где нет аттрибутов я создал руками при помощи программы).Но наверное не добавил.
Код - C# [Выбрать]
  1. DBObjectCollection ents = new DBObjectCollection();
  2. AttributeDefinition attr_sysname = new AttributeDefinition();
  3.             attr_sysname.Tag = "SYSNAME";
  4.             attr_sysname.TextString = "SYSNAME";
  5.             attr_sysname.Height = 1.8;
  6.             attr_sysname.Position = new Point3d(-6, height + 1, 0);
  7.             attr_sysname.Constant = true;
  8.             attr_sysname.LockPositionInBlock = true;
  9.             ents.Add(attr_sysname);

Пытался сделать так.Судя по всему я забыл записать это в таблицу блоков,так? Текст появляется и то,что это тег в итоге определяется
Название: Re: Двойной клик по блоку на чертеже.
Отправлено: Александр Пекшев aka Modis от 10-07-2015, 14:08:07
http://adndevblog.typepad.com/autocad/2012/06/inserting-a-block-with-attributes-to-modelspace.html
Название: Re: Двойной клик по блоку на чертеже.
Отправлено: Алексей Кулик от 10-07-2015, 14:35:36
А сначала создавалось полное описание блока (включая описания атрибутов) и потом его вставляли или сначала вставили, а описание атрибутов добавляли в описание блока после?
Название: Re: Двойной клик по блоку на чертеже.
Отправлено: Александр Пекшев aka Modis от 10-07-2015, 14:44:51
Вот пример более подходящий - http://www.acadnetwork.com/index.php?topic=160.0
Название: Re: Двойной клик по блоку на чертеже.
Отправлено: Алексей Кулик от 10-07-2015, 14:47:16
Я к тому, что может понадобится нечто типа _.attsync. Правда, насколько я помню, Андрей Бушман в свое время дооолго с ним воевал.
Название: Re: Двойной клик по блоку на чертеже.
Отправлено: Denis от 10-07-2015, 15:27:54
Я более полно напишу код,будет понятно,что и как я делал)
Код - C# [Выбрать]
  1. BlockTableRecord btr = new BlockTableRecord();                    
  2.                     btr.Name = blkNameж
  3.                     bt.UpgradeOpen();
  4.                     Autodesk.AutoCAD.ApplicationServices.Application.UpdateScreen();
  5.                     ObjectId btrId = bt.Add(btr);
  6.                     tr.AddNewlyCreatedDBObject(btr, true);
  7.                     DBObjectCollection ents = SquareOfLines(length, height);
  8.                     foreach (Entity ent in ents)
  9.                     {
  10.  
  11.                         btr.AppendEntity(ent);
  12.                         tr.AddNewlyCreatedDBObject(ent, true);
  13.  
  14.                     }
  15.  
  16.  
  17.  private DBObjectCollection SquareOfLines(double length, double height)
  18.         {
  19.             Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  20.             Database db = doc.Database;
  21.             DBObjectCollection ents = new DBObjectCollection();
  22. AttributeDefinition attr_sysname = new AttributeDefinition();
  23.             attr_sysname.Tag = "SYSNAME";
  24.             attr_sysname.TextString = "SYSNAME";
  25.             attr_sysname.Height = 1.8;
  26.             attr_sysname.Position = new Point3d(-6, height + 1, 0);
  27.             attr_sysname.Constant = true;
  28.             attr_sysname.LockPositionInBlock = true;
  29.             ents.Add(attr_sysname);
  30.  
  31.             AttributeDefinition attr_manuf = new AttributeDefinition();
  32.             attr_manuf.Tag = "MANUFACTURER";
  33.             attr_manuf.Height = 1.8;
  34.             attr_manuf.Position = new Point3d(- length + 1, height -2, 0);
  35.             attr_manuf.TextString = manufacturer;
  36.             attr_manuf.Constant = true;
  37.             attr_manuf.LockPositionInBlock = true;
  38.             ents.Add(attr_manuf);
  39.            return ents;
  40.         }

Как-то так)
Название: Re: Двойной клик по блоку на чертеже.
Отправлено: Александр Ривилис от 10-07-2015, 22:19:10
Вижу создание блока, но не вижу вставку блока с атрибутами.
Название: Re: Двойной клик по блоку на чертеже.
Отправлено: Denis от 11-07-2015, 00:13:46
Создал по примеру атрибут, теперь открывается табличка нужная и все хорошо,НО.
При смене Value название все равно остается тем же самым. Тут тоже прописывается какой-то апдейт?
Название: Re: Двойной клик по блоку на чертеже.
Отправлено: Александр Ривилис от 11-07-2015, 00:22:48
При смене Value название все равно остается тем же самым.
А должно было измениться? Давай код. Только не обрывками. Тогда возможно будет понятно чего ты добиваешься.
Название: Re: Двойной клик по блоку на чертеже.
Отправлено: Алексей Кулик от 11-07-2015, 00:29:26
Название или значение?
Название: Re: Двойной клик по блоку на чертеже.
Отправлено: bender от 11-07-2015, 01:06:45
attr_sysname.Constant = true;

?
Название: Re: Двойной клик по блоку на чертеже.
Отправлено: Denis от 12-07-2015, 16:36:08
attr_sysname.Constant = true;
Именно так,без него он вообще невидим.

Код следующий.
Код - C# [Выбрать]
  1. BlockTableRecord curSpace = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  2.                            BlockReference insert = new BlockReference(point, btrId);
  3.                            curSpace.AppendEntity(insert);
  4.                            insert.BlockUnit = UnitsValue.Millimeters;
  5.                            tr.AddNewlyCreatedDBObject(insert, true);
  6.                            AttributeDefinition attr_sysname = new AttributeDefinition();
  7.                            attr_sysname.Tag = "SYSNAME";
  8.                            attr_sysname.TextString = "SYSTEM";              
  9.                            attr_sysname.Height = 1.8;
  10.                            attr_sysname.Position = new Point3d(-6, height + 1, 0);
  11.                            attr_sysname.Constant = true;
  12.                            btr.AppendEntity(attr_sysname);
  13.                            tr.AddNewlyCreatedDBObject(attr_sysname, true);

При двойном нажатии на блок появляется таблица  Enhanced Attribute Editor,вижу тэг "SYSNAME", при попытке изменить его Value ничего не происходит,все равно видно только то, что записано здесь: attr_sysname.TextString = "SYSTEM"; 
Название: Re: Двойной клик по блоку на чертеже.
Отправлено: Александр Ривилис от 12-07-2015, 16:52:40
Какой позор. Посмотри готовые примеры, ссылки на которые тебе приводили. Посмотри этот пример: http://adn-cis.org/sozdanie-bloka-s-mnogostrochnyim-opredeleniem-atributa.html
Ты не добавил атрибуты к вставке блока. Поэтому и не видишь их.
Название: Re: Двойной клик по блоку на чертеже.
Отправлено: bender от 12-07-2015, 17:03:46
Цитировать
Ты не добавил атрибуты к вставке блока. Поэтому и не видишь их.

Это да, скорее всего. Но ЯТД проще все. Создаются постоянные атрибуты. С чего они редактироваться-то должны?

Код - vb.net [Выбрать]
  1.             With attDef
  2.                 .Prompt = "Типо подсказка"
  3.                 .Tag = "SYSNAME"
  4.                 .TextString = "SYSTEM"
  5.                 .Height = 1.8
  6.                 .Visible = True
  7.                 .Verifiable = True
  8.                 .Preset = True
  9.                 .Constant = False
  10.                 '.TextStyleId = id
  11.                 .IsMTextAttributeDefinition = False
  12.                 '.Layer = NameLayer
  13.                 '.ColorIndex = ColorAttDef
  14.                 .Position = new Point3d(-6, height + 1, 0)
  15.                 '.Rotation = AngleAttDef
  16.                 '.HorizontalMode = HModeAttDef
  17.                 '.VerticalMode = VModeAttDef
  18.                 '.AlignmentPoint = AlignPnt
  19.                 '.Justify = JustifyAttDef
  20.                 '.Annotative = AnnoAttDef
  21.                 '.WidthFactor = xScaleTxt
  22.             End With
  23.  
  24.  
Название: Re: Двойной клик по блоку на чертеже.
Отправлено: Александр Ривилис от 12-07-2015, 17:22:17
Постоянные они в том смысле, что общие для всех вставок этого блока. Но редактировать их можно.  Конечно же ему не нужен постоянный атрибут. У TC проблема в незнании AutoCAD и его API. А ещё в том, что он не ищет примеры и не изучает их. Это печально. :(
Название: Re: Двойной клик по блоку на чертеже.
Отправлено: Denis от 12-07-2015, 23:11:00
ТС извиняется и старается.Спасибо за помощь.
Название: Re: Двойной клик по блоку на чертеже.
Отправлено: Александр Ривилис от 12-07-2015, 23:16:47
ТС извиняется и старается.Спасибо за помощь.
Надеюсь, что сказанное мной, не воспринято как обида. К сожалению я сейчас (и до конца месяца) далёк от компьютера и нормального интернета и поэтому не могу привести полноценный пример. Приходится давать ссылки на "полуфбрикаты".
Название: Re: Двойной клик по блоку на чертеже.
Отправлено: Denis от 12-07-2015, 23:31:35
Ни в коем случае. Мне учиться еще и учиться.