Создание гиперссылки для объекта автокада

Автор Тема: Создание гиперссылки для объекта автокада  (Прочитано 7076 раз)

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

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

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Вот здесь товарищ 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);
По мне, так довольно неочевидное поведение (совсем невнятные имена свойств класса получаются).
Интересно, как оно работает в других версиях автокада..
« Последнее редактирование: 11-02-2014, 15:06:27 от bargool »
Алексей

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Объект, к которому добавляешь гиперссылку уже добавлен в базу данных? См. коммент 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-м проблем с гиперссылками не было: тынц.

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

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Да, добавлен. Собственно, у тебя происходит всё то же самое, что и у меня. Сама ссылка - в имени (sic!)
Цитировать
link.Name = csvFileName;
Именно так я и написал. Просто пример от adn-овца неправильный. Причём заведомо неправильный. Вот о чём мой пост =)
Алексей

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Просто пример от adn-овца неправильный. Причём заведомо неправильный. Вот о чём мой пост =)
Да, похоже на то... Свойство SubLocation предназначено совершенно для другого: с его помощью можно переходить к конкретной части документа, указанного по ссылке, заданной в свойстве Name. Например я использовал его для того, чтобы при открытии гиперссылкой документа в Excel сразу же переходить на нужную строку данных, относящихся к этой ссылке.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Так коментни ему - и на старуху бывает проруха - накосячил чуток.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Просто пример от adn-овца неправильный. Причём заведомо неправильный. Вот о чём мой пост =)
Подтверждаю. Отпишешься ему в блоге?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Алексей

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я догадываюсь почему у него не было ошибки в этой ситуации. Скорее всего у выбранного им примитива уже была корректная гиперссылка. В этом случае его код фактически ничего не делает. Почему? Потому что AutoCAD выводит всегда только первую гиперссылку, а до всех остальных можно добраться только программным путем.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн fattyhallex

  • ADN Club
  • Сообщений: 16
  • Карма: 0
А вот если 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();
                }

Как то так
« Последнее редактирование: 11-02-2014, 21:34:21 от fattyhallex »