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

ADN Club => AutoCAD .NET API => Тема начата: Алексей Терно от 10-06-2019, 18:08:05

Название: Как определить точку вставки внешней ссылки?
Отправлено: Алексей Терно от 10-06-2019, 18:08:05
Есть чертеж, в котором подключены другие чертежи в виде внешних ссылок. Вне внешние ссылки я нахожу по этому алгоритму:
http://adn-cis.org/kak-najti-vse-vneshnie-ssyilki-v-tekushhej-baze-s-pomoshhyu-c.html (http://adn-cis.org/kak-najti-vse-vneshnie-ssyilki-v-tekushhej-baze-s-pomoshhyu-c.html)
А как получить точку вставки и масштаб каждой из ссылок?
Название: Re: Как определить точку вставки внешней ссылки?
Отправлено: Александр Ривилис от 10-06-2019, 18:14:08
А как получить точку вставки и масштаб каждой из ссылок?
Сначала как минимум нужно найти вставку внешней ссылки (BlockReference), если она есть (а ёё может и не быть). Ну а затем получить её точку вставки и масштаб.
Название: Re: Как определить точку вставки внешней ссылки?
Отправлено: Александр Ривилис от 11-06-2019, 11:43:14
Сильно упрощенно код будет выглядеть так:
Код - 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. }
Название: Re: Как определить точку вставки внешней ссылки?
Отправлено: Алексей Терно от 11-06-2019, 12:56:57
Ваш вариант мне нравится больше, чем мой )
Пошел переделывать.
Название: Re: Как определить точку вставки внешней ссылки?
Отправлено: Алексей Терно от 13-06-2019, 17:09:13
Все отлично работает  :)
Спасибо!
Название: Re: Как определить точку вставки внешней ссылки?
Отправлено: Александр Ривилис от 13-06-2019, 17:12:03
Все отлично работает  :)
Спасибо!
Ну вообще-то в общем случае нужно еще учитывать вложенность внешних ссылок и то, что точка вставки вложенной внешней ссылки может не совпадать с началом WCS, возможность поворота...
Название: Re: Как определить точку вставки внешней ссылки?
Отправлено: Алексей Терно от 13-06-2019, 17:16:01
Ну вообще-то в общем случае нужно еще учитывать вложенность внешних ссылок и то, что точка вставки вложенной внешней ссылки может не совпадать с началом WCS, возможность поворота...
А еще и масштаб :)
У меня упрощенный вариант - вложенных ссылок не будет, угол поворота и масштаб всегда 0 и 1 соответственно. Отличия могут быть только в точке вставки.