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

ADN Club => AutoCAD .NET API => Тема начата: bargool от 11-02-2014, 13:51:55

Название: Создание гиперссылки для объекта автокада
Отправлено: bargool от 11-02-2014, 13:51:55
Вот здесь (http://adndevblog.typepad.com/autocad/2012/05/how-to-create-a-hyperlink-on-an-entity.html) товарищ Augusto Goncalves пишет, как надо прикреплять ссылку к Entity.
Рапортую: в 2014 автокаде рецепт не работает!
А вот если SubLocation не задавать, а нужный url поместить в Name - всё работает!
Так - работает:
Код - C# [Выбрать]
  1. HyperLink link = new HyperLink();
  2. link.Description = "Описание ссылки";
  3. link.Name = uri;
  4. ent.Hyperlinks.Add(link);
По мне, так довольно неочевидное поведение (совсем невнятные имена свойств класса получаются).
Интересно, как оно работает в других версиях автокада..
Название: Re: Создание гиперссылки для объекта автокада
Отправлено: Андрей Бушман от 11-02-2014, 14:59:23
Объект, к которому добавляешь гиперссылку уже добавлен в базу данных? См. коммент 391-396.
Код - C# [Выбрать]
  1.  380:              // Создаю гиперссылку, которая должна отображаться при наведении курсора на объект
  2.  381:              // полилинии
  3.  382:              HyperLink link = new HyperLink();
  4.  383:              //Текст, который должна отображать гиперссылка
  5.  384:              link.Description = string.Format("Точка № {0}. Координаты: {1}, {2}, {3}.", nom,
  6.  385:                  ucsPoint.X, ucsPoint.Y, ucsPoint.Z);
  7.  386:              //Ссылка на конкретную ячейку в csv-файле (внутренняя ссылка)
  8.  387:              link.SubLocation = string.Format("A{0}:D{0}", rowNomber);
  9.  388:              //Место расположения ресурса, который должен открываться гиперссылкой
  10.  389:              link.Name = csvFileName;
  11.  390:  
  12.  391:              /// Добавить гиперссылку можно только к тому объекту, который уже имеется в базе дан-
  13.  392:              /// ных. Причём добавление должно осуществляться в блоке транзакции, а сам объект, к
  14.  393:              /// которому добавляется гиперссылка, должен быть открыт для записи. Поэтому сначала в
  15.  394:              /// одном блоке транзакции добавляю в базу чертежа объект вхождения блока, затем сохраняю
  16.  395:              /// изменения, выхожу из транзакции и создаю новый блок транзакции, в котором добавляю
  17.  396:              /// к объекту вхождения гиперссылку

Цитировать
Интересно, как оно работает в других версиях автокада..
В 2009-м проблем с гиперссылками не было: тынц (https://sites.google.com/site/bushmansnetlaboratory/moi-zametki/points).
Название: Re: Создание гиперссылки для объекта автокада
Отправлено: bargool от 11-02-2014, 15:03:56
Да, добавлен. Собственно, у тебя происходит всё то же самое, что и у меня. Сама ссылка - в имени (sic!)
Цитировать
link.Name = csvFileName;
Именно так я и написал. Просто пример от adn-овца неправильный. Причём заведомо неправильный. Вот о чём мой пост =)
Название: Re: Создание гиперссылки для объекта автокада
Отправлено: Андрей Бушман от 11-02-2014, 15:36:20
Просто пример от adn-овца неправильный. Причём заведомо неправильный. Вот о чём мой пост =)
Да, похоже на то... Свойство SubLocation предназначено совершенно для другого: с его помощью можно переходить к конкретной части документа, указанного по ссылке, заданной в свойстве Name. Например я использовал его для того, чтобы при открытии гиперссылкой документа в Excel сразу же переходить на нужную строку данных, относящихся к этой ссылке.
Название: Re: Создание гиперссылки для объекта автокада
Отправлено: Дима_ от 11-02-2014, 15:51:10
Так коментни ему - и на старуху бывает проруха - накосячил чуток.
Название: Re: Создание гиперссылки для объекта автокада
Отправлено: Александр Ривилис от 11-02-2014, 16:00:40
Просто пример от adn-овца неправильный. Причём заведомо неправильный. Вот о чём мой пост =)
Подтверждаю. Отпишешься ему в блоге?
Название: Re: Создание гиперссылки для объекта автокада
Отправлено: bargool от 11-02-2014, 16:16:09
Отпишешься ему в блоге?
Готово =)
Название: Re: Создание гиперссылки для объекта автокада
Отправлено: Александр Ривилис от 11-02-2014, 16:20:48
Я догадываюсь почему у него не было ошибки в этой ситуации. Скорее всего у выбранного им примитива уже была корректная гиперссылка. В этом случае его код фактически ничего не делает. Почему? Потому что AutoCAD выводит всегда только первую гиперссылку, а до всех остальных можно добраться только программным путем.
Название: Re: Создание гиперссылки для объекта автокада
Отправлено: fattyhallex от 11-02-2014, 21:06:57
А вот если SubLocation не задавать, а нужный url поместить в Name - всё работает!
У меня работает в 2014-м, после вставки ссылки выделишь объект
и выберешь из всплывающего меню -> Hyperlink -> Open ...
Открывается ссылка с выделенным диапазоном, который указан
в SubLocation:
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    Entity ent = tr.GetObject(res.ObjectId, OpenMode.ForRead) as Entity;
                    Polyline poly = ent as Polyline;
                    HyperLinkCollection hyps = null;                   
                    if (poly != null)
                    {
                        if (!poly.IsWriteEnabled)
                        poly.UpgradeOpen();
                        hyps = poly.Hyperlinks;
                        HyperLink hyp = new HyperLink();
                        hyp.Name = "C:\\Test\\Points.xls";
                        hyp.SubLocation = "Sheet1!$A$10:$C$10";
                        hyp.Description = "Linked to: \"A10:C10\" range";
                        hyps.Add(hyp);
                        poly.DowngradeOpen();                       
                    }
                    tr.Commit();
                }

То же для чертежей, но надо указывать именованный вид,
в линкованном документе:
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    Entity ent = tr.GetObject(res.ObjectId, OpenMode.ForRead) as Entity;
                    Polyline poly = ent as Polyline;
                    HyperLinkCollection hyps = null;                   
                    if (poly != null)
                    {
                        if (!poly.IsWriteEnabled)
                        poly.UpgradeOpen();
                        hyps = poly.Hyperlinks;
                        HyperLink hyp = new HyperLink();                 
                        hyp.Name = "C:\\MyDrawing.dwg";
                        hyp.SubLocation = "MyView";//<--   вид создан и сохранен в любой вкладке
                        hyp.Description = "Linked to \"MyView\"";
                        hyps.Add(hyp);
                        poly.DowngradeOpen();


                    }
                    tr.Commit();
                }

Как то так