Импорт координат из текстового файла в чертёж nanoCAD на MultiCAD .NET API



    В предыдущей статье мы писали о том, как импортировать точки из внешнего текстового файла в .dwg чертеж при помощи классического .NET API. В данной статье мы рассмотрим особенности решения этой же задачи на кросс-САПР-платформенном MultiCAD .NET API и продемонстрируем, как построенное приложение может быть запущено в nanoCAD и в AutoCAD без изменения настроек проекта и перекомпиляции.

    Создание и настройка рабочего проекта

    Проект создается точно также как и для предыдущего примера:

    • Project type: Visual C#
    • Template: Class Library

    Все, что необходимо сделать — это всего лишь подключить библиотеку mapimgd.dll, входящую в комплект поставки nanoCAD SDK, начиная с версии 4.0. Конфигурация проекта остается неизменной для разработки приложений, запускаемых как на платформе nanoCAD, так и на других системах, в частности, AutoCAD. Если в предыдущем проекте было две конфигурации — Debug NCAD и Debug ACAD, то в этом будет одна — Debug MultiCAD.

    Импорт координат и добавление примитивов в базу данных чертежа

    Структура приложения и общий код (форма приложения, организация предварительного просмотра, импорт координат из файла) остаются прежними, классы же Importer и Creator, код которых зависил от конкретной платформы, будут изменены.

    Так, метод Creator.createPoints(), отвечающий за непосредственное создание точек для входного массива координат теперь выглядит следующим образом:

    public static void CreatePoints(List coords)
    {
      for(int i = 0; i<coords.Count-2; i += 3)
      {          
        // Create a point object
        DbPoint point = new DbPoint();
    
        // Set the position for the point object
        point.Position = new Point3d(coords[i], coords[i + 1], coords[i + 2]);
    
        // Add the point entity to the current document
        point.DbEntity.AddToCurrentDocument();
      }
    }
    


    Напомним, как выглядела процедура создания точек ранее, при использовании классического .NET API:

    public static void CreatePoints(List coords)
    {
      DocumentCollection dm = Platform.ApplicationServices.Application.DocumentManager;
      Database db = dm.MdiActiveDocument.Database;
      using (db)
      {
        // Create a transaction
        using (Transaction tr = db.TransactionManager.StartTransaction())
        {
          // Get the table block record for current drawing space
          BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
          for (int i = 0; i < coords.Count - 2; i += 3)
          {
            // Create a point object
            DBPoint point = new DBPoint(new Point3d(coords[i], coords[i + 1], coords[i + 2]));
    
            // Append the point to the database
            btr.AppendEntity(point);
    
            // Add the object to the transaction
            tr.AddNewlyCreatedDBObject(point, true);
          }
    
          btr.Dispose();
    
          // Commit the transaction
          tr.Commit();
        }
      }
    }
    


    Очевидно, что объем кода, необходимого для реализации этого метода, значительно сократился: для создания объекта, задания координат и добавления в базу потребовалось всего три строки кода! И это еще одна отличительная особенность MultiCAD.NET: помимо решения своей основной задачи — обеспечения кроссплатформенности приложений — MultiCAD.NET API позволяет сделать код приложения гораздо более компактным. Это достигается за счет того, что многие вспомогательные операции уже «встроены» в основную функциональность.

    Буквально ненадолго остановимся на процедуре добавления точек на чертеж. Не вдаваясь в подробности (это тема отдельной статьи), заметим, что в MultiCAD API реализовано три уровня геометрии для графических объектов: чистая «математическая» геометрия, геометрия с добавлением основных свойств примитивов: цвет, толщина и стиль линий и др., и уровень объектов базы данных. В нашем случае мы создали стандартный геометрический объект DbPoint, задали его геометрические параметры и использовали свойство DbEntity для перехода на уровень базы данных и добавления объекта на чертеж. При этом нет необходимости определять текущее пространство чертежа: метод AddToCurrentDocument() автоматически определит, какой документ является текущим, и какое рабочее пространство используется в данной момент.

    Загрузка приложения в nanoCAD и AutoCAD

    Теперь, когда код скомпилирован и .NET-сборка для приложения построена, самое время поговорить о вариантах запуска приложения под различными системы.

    • Загрузка приложений для среды nanoCAD осуществляется стандартными командами NETLOAD или APPLOAD,
    • Для запуска приложений в системах, отличных от nanoCAD, требуется использование специального приложения-адаптера (Object Enabler). Например, для AutoCAD необходимо вначале загрузить приложение MultiCAD Enabler for AutoCAD (доступно после регистрации в Клубе разработчиков nanoCAD), а затем и скомпилированное приложение — командой NETLOAD.

    Исходный код проекта доступен здесь.

    Обсуждение статьи доступно также и на нашем форуме: forum.nanocad.ru/index.php?showtopic=6509.

    Перевод статьи на английский: Importing coordinates from a text file to a nanoCAD drawing using the MultiCAD.NET API.
    Нанософт
    63.18
    Company
    Share post

    Comments 10

      +1
      Я конечно извиняюсь, но мне не совсем понятен смысл данной статьи. В чем отличие от предыдущей (кроме обертки в сдк на создание точек) — которая и так уже была баяном. Думаете поинты панацея для всего, а если программист не может сам создать их без целой серии статей на эту тему, то стоит ему задуматься. А то что оно запускается в нанокаде не удивительно — интерфейсы копируют акадовские. Опишите лучше какой-нибудь более сложный и востребованный процесс, то что реально людям нужно. Еще раз извиняюсь.
        0
        постепенно, спокойно… и обойдем все случаи ))
          0
          Без обид. Но такими темпами это не получится или Вы заведомо пытаетесь ввести в заблуждение. Вот вместо 4-х статей про «крестики нолики» лучше сразу пишите дельные технические топики. Вот например я с удовольствие почитал бы статью как подменить определение RXClass у примитива. Ну как стоит ожидать? Спасибо.
            0
            Не хочу лихо обещать за автора, но этот блог и был создан, чтобы работала обратная связь ))) поэтому завки на последующие темы также собираем )
              0
              Мммм… Может быть это? Modifying an AutoCAD object’s state via a dynamic property defined using .NET
              Там к RXClass добавляют еще одно поле. Может покатит? :)
                0
                Вполне можем поставить такую статью в план, только осталось разобраться зачем это нужно. Какую задачу Вы пытаетесь решить подменой RXClass-а?
                  0
                  Для своих нужд я это сделал, но хочется увидеть другие возможные способы. Для примера: хочу при выборе, определенного, блока в проперти видеть не вхождение блока, а блаблабла1, добавление самих пропертисов не нужно.
              0
              Классическое .NET API — да, копия AutoCAD-овского, но MultiCAD.NET — наша разработка. Поэтому и написали эту статью как ответ на вопрос «Что-то я не пойму как на вашем модном API даже точку в чертёж добавить». А про сам импорт точек писал в заголовке предыдущей статьи, не программисты, но продвинутые пользователи регулярно спрашивают как это сделать.

              Понимание того, что людям нужно, у всех разное, поэтому, мы с интересом собираем пожелания. Вот только, между сложными и востребованными процессами зависимость, как правило, обратно-пропорциональная.
              0
              И зачем так много комментариев, которые попросту дублируют то, что написано в коде?
                0
                Идея создания упрощенного API (MultiCAD.NET) — это здорово. Все таки стандартное AutoCAD .NET API немного «непрозрачное». Немало неудобств доставляет тот факт, что AutoCAD .NET API не покрывает весь функционал AutoCAD-а, и некоторые команды приходится вызывать с помощью метода SendStringToExecute("… "), параметром которого является название команды в виде строки. Такой подход всегда приводит к runtime ошибкам. Плюс иногда необходимо использовать метод SendCommand(), что требует использования COM библиотеки (а это уже смешивание технологий), что увеличивает вероятность появления ошибок в программе, и снижает читабельность кода. Надеюсь Ваша команда сможет исправить эти и другие «неудобства» стандартного AutoCAD .NET API, и мы (разработчики под AutoCAD и nanoCAD) получим удобное и интуитивно понятное API.

                Only users with full accounts can post comments. Log in, please.