Как определить точку вставки внешней ссылки?

Автор Тема: Как определить точку вставки внешней ссылки?  (Прочитано 4004 раз)

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

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Есть чертеж, в котором подключены другие чертежи в виде внешних ссылок. Вне внешние ссылки я нахожу по этому алгоритму:
http://adn-cis.org/kak-najti-vse-vneshnie-ssyilki-v-tekushhej-baze-s-pomoshhyu-c.html
А как получить точку вставки и масштаб каждой из ссылок?

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

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

Отмечено как Решение Алексей Терно 13-06-2019, 17:09:20

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Сильно упрощенно код будет выглядеть так:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7.  
  8. [assembly: CommandClass(typeof(ScanXref.MyCommands))]
  9.  
  10. namespace ScanXref
  11. {
  12.  
  13.   public class MyCommands
  14.   {
  15.     [CommandMethod("XrefGraph")]
  16.     public static void XrefGraph()
  17.     {
  18.       Document doc = Application.DocumentManager.MdiActiveDocument;
  19.       Database db = doc.Database;
  20.       Editor ed = doc.Editor;
  21.       using (Transaction Tx = db.TransactionManager.StartTransaction())
  22.       {
  23.         ed.WriteMessage("\n---Находим все внешние ссылки ------------------");
  24.         db.ResolveXrefs(true, false);
  25.         XrefGraph xg = db.GetHostDwgXrefGraph(true);
  26.         ed.WriteMessage("\n---Граф внешних ссылок -------------------------");
  27.         ed.WriteMessage("\nТекущий чертеж ");
  28.         GraphNode root = xg.RootNode;
  29.         printChildren(root, "|-------", ed, Tx);
  30.         ed.WriteMessage("\n----------------------------------------\n");
  31.       }
  32.     }
  33.  
  34.     // Рекурсивно печатаем информацию об иерархии внешних ссылок
  35.     private static void printChildren(GraphNode i_root, string i_indent,
  36.                                       Editor i_ed, Transaction i_Tx)
  37.     {
  38.       for (int o = 0; o < i_root.NumOut; o++)
  39.       {
  40.         XrefGraphNode child = i_root.Out(o) as XrefGraphNode;
  41.         if (child.XrefStatus == XrefStatus.Resolved)
  42.         {
  43.           BlockTableRecord bl =
  44.             i_Tx.GetObject(child.BlockTableRecordId, OpenMode.ForRead)
  45.                 as BlockTableRecord;
  46.  
  47.           i_ed.WriteMessage("\n" + i_indent + child.Database.Filename);
  48.           ObjectIdCollection idsBref = bl.GetBlockReferenceIds(false, true);
  49.           if (idsBref.Count > 0)
  50.           {
  51.             for (int i = 0; i < idsBref.Count; i++)
  52.             {
  53.               BlockReference bref =
  54.                 i_Tx.GetObject(idsBref[i], OpenMode.ForRead)
  55.                     as BlockReference;
  56.               if (bref != null)
  57.               {
  58.                 i_ed.WriteMessage("\n {0} Origin = {1}, Scale = {2}", i, bref.Position, bref.ScaleFactors);
  59.               }
  60.             }
  61.           }
  62.           printChildren(child, "| " + i_indent, i_ed, i_Tx);
  63.         }
  64.       }
  65.     }
  66.   }
  67. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Ваш вариант мне нравится больше, чем мой )
Пошел переделывать.

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Все отлично работает  :)
Спасибо!

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

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

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Ну вообще-то в общем случае нужно еще учитывать вложенность внешних ссылок и то, что точка вставки вложенной внешней ссылки может не совпадать с началом WCS, возможность поворота...
А еще и масштаб :)
У меня упрощенный вариант - вложенных ссылок не будет, угол поворота и масштаб всегда 0 и 1 соответственно. Отличия могут быть только в точке вставки.