Поиск

Скачать текстовый файл txt с координатами. Импорт координат из текстового файла в чертёж nanoCAD на классическом.NET API. Загрузка приложения в nanoCAD

Представляем Вашему вниманию дополнительные приложения для подключения к ПО AutoCAD.

Все приложения распространяются бесплатно

1. Geo_Tools - набор инструментов для топографов, геодезистов, работает как надстройка к AutoCAD (начиная с AutoCAD 2008).

При установке инструментов стандартная палитра инструментов AutoCAD заменяется на палитры geo_tools, следует учитывать тем кто наполнил палитру своими инструментами или использует стандартную. Начиная с версии 2014.05.11 21-47 не заменяет, а добавляются в стандартные палитры.

Если набор Geo_Tools не понравился после удаления его - все изменения вернется к стандартному для AutoCAD. Панели инструментов и ленту geo_tools не трогают.

Скачать версию 2015.07 можно по ссылке добавлено поддержка AutoCAD 2016.

Скачать версию 2016.10 можно по ссылке добавлено поддержка AutoCAD 2017.

Скачать версию 2017.10 можно по ссылке добавлена возможность задавать слой импорта точек и вставка блоков на точки по описанию.

Инструкция по установке:

1. Распаковать и разместить скачанные данные в папку "C :\Program Files\geo_tools\ "

(примечание: для AutoCAD 2014-2016 эту папку необходимо добавить в доверенные источники: ввести _options в консоли, в разделе Файлы -> Доверенные местоположения -> добавить строку "c:\Program Files\geo_tools... ")

2. В консоли ввести "_APPLOAD " -> зайти в папку "C :\Program Files\geo_tools\ " и выбрать файл "acaddoc.lsp " -> нажать "Загрузить "

2. Программа для загрузки точек в ПО AutoCAD.

Приложение позволяет загружать точки в текстовом формате и формате SDR.

_APPLOAD " -> выбрать скачанный файл и нажать "Загрузить ".

3. Программа для экспорта точек из ПО AutoCAD.

Приложение позволяет выгрузить точки в текстовом формате для последующей отправки в приборы.

Для загрузки приложения необходимо в консоли ввести "_APPLOAD " -> выбрать скачанный файл и нажать "Загрузить ".

4. Программа авто рисование отклонений AutoCAD

Программа помогает в оформлении исполнительных схем в строительстве, производя отрисовку отклонений измеренных точек от проектного положения.

Скачать приложение.

Одним из наиболее популярных вопросов по программированию под nanoCAD является «Как мне импортировать точки из текстового файла?». Задача это несложная, но профессиональный проектировщик не обязан быть профессиональным программистом, поэтому эту статью мы написали в стиле «для начинающих».

Импортировать координаты в чертёж можно на любом из существующих в nanoCAD видов API. Мы решили выбрать.NET и сравнить два близких API: классический.NET API и кросс-САПР-платформенный MultiCAD.NET API. Под катом - первая часть - импорт точек на классическом.NET API.

Дано: текстовый файл с координатами X, Y, Z точек, одна точка на строке. Координаты разделены пробелом, разделитель дробной части - точка.

Требуется: написать приложение, которое по команде IMPORTCOORDS запрашивает имя файла и импортирует найденные координаты в текущее пространство чертёжа в виде объектов DatabaseServices.DBPoint . Координаты объектов должны импортироваться в текущей пользовательской системе координат (UCS) чертежа.

Создание и настройка рабочего проекта
Для создания приложения нам понадобятся следующие инструменты:
  • nanoCAD (версия не ниже 3.5)
  • Microsoft Visual Studio 2008 (nanoCAD 3.5 - nanoCAD 5.0 поддерживают загрузку.NET-приложений, построенных на.NET Framework 3.5).
Ну и, конечно же, подразумевается, что вы хотя бы немного умеете программировать на языке C#. Если нет - добро пожаловать в библиотеку MSDN .

Создаем новый проект в Visual Studio со следующими настройками:

  • Project type: Visual C#
  • Template: Class Library
Таким образом, наше приложение представляет собой обычную.NET-сборку (DLL), которая впоследствие будет загружена в nanoCAD.
Во вкладке References подключаем следующие библиотеки, входящие в состав комплекта nanoCAD:
  • hostdbmgd.dll
  • hostmgd.dll
Теперь можно смело переходить к написанию самой программы.
Структура программы
Реализацию можно разбить на следующие шаги:
  1. Зарегистрировать команду IMPORTCOORDS.
  2. Получить базу данных текущего чертежа и редактор командной строки.
  3. Запросить имя файла с координатами.
  4. Открыть файл, прочитать строки с координатами.
  5. Создать объекты DBPoint с отдельными координатами. Преобразовать их координаты в текущую пользовательскую систему координат.
  6. Добавить созданные объекты в текущее пространство чертежа (Model Space или Paper Space).
Для того, чтобы зарегистрировать команду, которая будет вызывать наше приложение в nanoCAD нужно перед определением метода, который будет вызываться по этой команде, объявить аттрибут и указать имя команды. Обратите внимание, метод должен иметь модификатор public:

Public void importCoords() { ... }
Прежде чем продолжить, хотелось бы остановиться и в двух словах рассказать, что же такое «база данных чертежа». .dwg-файл представляет собой базу данных, имеющую строгую структуру, основные элементы которой - таблицы (Symbol Tables), которые содержат все объекты чертежа. Это не только графические объекты, которые мы видим на чертеже (прямые, дуги, точки и тд.), но и множество других объектов, которые определяют содержимое и настройки чертежа. Например, таблица слоев (Layer Table) содержит в себе все слои, которые имеются на чертеже, таблица типов линий (Linetype Table) хранит все стили линий, определенные в чертеже, таблица пользовательских систем координат (UCS Table) - все системы координат, созданные пользователем для данного чертежа, и др. Таким образом, создать новый объект чертежа - значит создать соответствующий объект базы данных.

Итак, продолжаем. В первую очередь нам необходимо выбрать из всех открытых документов текущий и открыть его базу данных. Для этого мы получаем объект-менеджер всех открытых документов, и затем с его помощью и базу данных, с которой мы будем дальше работать.

DocumentCollection dm = Application.DocumentManager; Database db = dm.MdiActiveDocument.Database;
Для того, чтобы наше приложение запрашивало имя файла, необходимо получить объект Editor и вызвать метод, который запрашивает пользовательский ввод определённого типа (в нашем случае имя файла):

// Получаем редактор командной строки Editor ed = dm.MdiActiveDocument.Editor; // Объект для получения результата запроса PromptFileNameResult sourceFileName; // Выводим запрос в командную строку и получаем результат sourceFileName = ed.GetFileNameForOpen("\nEnter the name of the coordinates file to be imported:"); if (sourceFileName.Status == PromptStatus.OK) { ... }
Получить координаты из файла довольно просто, используя C#-функционал для чтения текстовых файлов и работы со строковыми типами данных:

// Читаем файл, получаем содержимое в виде массива строк string lines = File.ReadAllLines(sourceFileName.StringResult); // Для каждой строки записываем массив из подстрок, разделенных пробелом (т.к по условию задачи в качестве разделителя координат выступает символ пробела). // Таким образом получаем массив из координат, только в текстовом виде, затем конвертируем их в числа типа double. string coord; foreach (string s in lines) { coord = s.Split(new char { " " }); double coordX = Convert.ToDouble(coord); double coordY = Convert.ToDouble(coord); double coordZ = Convert.ToDouble(coord); }
Переходим к созданию графических примитивов (Entity). Как уже отмечалось выше, для того, чтобы создать любой объект (не только графический), который будет храниться в чертеже, его необходимо добавить в базу данных чертежа, а именно в соответствующий объект-контейнер. Так, например, все слои хранятся как записи в таблице слоев (Layer Table), которая является в этом случае для них объектом-контейнером. Общая структура базы данных выглядит следующим образом:

Графические примитивы хранятся в базе не напрямую, а в структуре отдельных блоков, которые в свою очередь являются записями в таблице блоков (Block Table). Это очень удобно, поскольку такой механизм позволяет легко группировать объекты в именованные блоки и управлять ими, как единым целым. К слову, пространство модели и пространства листа в базе также представлены отдельными блоками. Таким образом, для графического примитива контейнером будет являться отдельный блок, который, в свою очередь, будет принадлежать родительскому объекту - таблице блоков.

Раз мы работаем с базой данных, то необходимо обеспечить ее целостность и защиту в случае, если во время выполнения программы произошла какая-то ошибка. Для этой цели применяется механизм транзакций. Транзакции объединяют в себе целый ряд операций, которые выполняются как единое целое: если что-то пошло не так, транзакция отменяется, и объекты, созданные в рамках этой транзакции не будут добавлены в документ. Если же все операции завершились успешно, то транзакция подтверждается, и объекты добавляются в базу.

Вооружившись этими знаниями, можем смело добавлять в текущее пространство чертежа примитивы «точка» по координатам, которые мы прочитали из файла.

Using (Transaction tr = db.TransactionManager.StartTransaction()) { // Можно обойтись без таблицы блоков и получить блок текущего пространство чертежа прямо из объекта, представляющего базу данных BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); string lines = File.ReadAllLines(sourceFileName.StringResult); string coord; foreach (string s in lines) { coord = s.Split(new char { " " }); double coordX = Convert.ToDouble(coord); double coordY = Convert.ToDouble(coord); double coordZ = Convert.ToDouble(coord); DBPoint point = new DBPoint(new Point3d(coordX, coordY, coordZ)); btr.AppendEntity(point); tr.AddNewlyCreatedDBObject(point, true); } btr.Dispose(); tr.Commit(); }
Задача практически решена. Осталось выполнить одно условие: примитивы-точки должны создаваться в координатах пользовательской системы координат (UCS). Необходимо отметить, что примитивы хранятся в базе данных чертежа в мировой системе координат (WCS). Следовательно, при создании примитивов необходимо выполнить преобразование: UCS->WCS. Делается это при помощи матрицы пользовательской системы координат:

Matrix3d ucsMatrix = ed.CurrentUserCoordinateSystem;
Добавим преобразование:

{ ... point.TransformBy(ucsMatrix.Inverse()); ... }
Итак, программа полностью написана. Что же дальше?

Загрузка приложения в nanoCAD
Осталась самая приятная часть - загрузить программу в nanoCAD и любоваться результатами своей работы. Как вы помните, мы создавали рабочий проект как библиотеку классов, поэтому после успешной компиляции будет построена сборка с именем вашего проекта. Открываем nanoCAD, в командной строке пишем команду NETLOAD, выбираем из списка построенную библиотеку и загружаем. Для запуска программы просто введите имя команды IMPORTCOORDS в командной строке.
Импорт координат. Версия 2.0
Усовершенствуем первую версию приложения, добавив несколько полезных функций и элементы пользовательского интерфейса.

Если первая версия приложения «понимала» текстовый файл, в котором координаты разделены только пробелами и в качестве десятичного разделителя использовалась точка, то теперь приложение сумеет «распознать» координаты, разделенные символом табуляции, пробелом или точкой с запятой. Что же касается десятичного разделителя, то в качестве него теперь может выступать как точка, так и запятая, импорт будет производиться без учета региональных настроек. По команде IMPORTCOORDS теперь будет открываться модальный диалог импорта координат, в котором пользователь может выбрать файл и указать желаемые настройки импорта координат.

Общий механизм импорта координат и создания примитивов остается практически без изменений, однако теперь это будет происходить в рамках класса формы, а задача метода-обработчика команды IMPORTCOORDS теперь сводится лишь к созданию объекта формы и выводу формы на экран в виде модального диалога:

Public void importCoords() { Form form = new ImportForm(); HostMgd.ApplicationServices.Application.ShowModalDialog(form); }
После чего управление будет передано окну формы импорта координат.

Форма приложения
Форма для приложения включает в себя следующие элементы:
  • Кнопка для открытия файла
  • Диалог открытия файла
  • Группа чекбоксов для выбора символов-разделителей координат: табуляция, пробел, точка с запятой
  • Текстовое поле для предварительного просмотра разбора строк c координатами
  • Кнопка для импорта координат
  • Кнопка отмены
Используя эти элементы управления, пользователь теперь может указать желаемые символы-разделители, проверить результат в поле предварительного просмотра (примерно так, как это сделано в MS Excel при импорте текстового файла) и инициировать импорт координат:

Совместимость с AutoCAD
В заключение хотелось бы отметить, что приложение, написанное для nanoCAD, может быть с легкостью перекомпилировано и для работы в AutoCAD. Для этого необходимо сделать следующее:
  • Во вкладке References подключить следующие библиотеки, входящие в состав ObjectARX:
    • AcCoreMgd.dll
    • AcDbMgd.dll
    • AcMgd.dll
  • Добавить в код приложения директиву условной компиляции, для определения пространств имен, которые будут использоваться для компиляции под nanoCAD или AutoCAD:
    #if ACAD using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; using Platform = Autodesk.AutoCAD; using PlatformDb = Autodesk.AutoCAD; #else using HostMgd.ApplicationServices; using HostMgd.EditorInput; using Teigha.DatabaseServices; using Teigha.Geometry; using Teigha.Runtime; using Platform = HostMgd; using PlatformDb = Teigha; #endif
  • Заменить в коде специфичные для каждой платформы пространства имен на определенные выше псевдонимы: Platform и PlatformDb .
Обе версии проекта доступны

Программа загружает (импортирует) координаты точек из файлов формата *.txt, *.csv, *. tsv в программу Autocad версии 2000-2013 .

Файл c координатами для импорта может быть сформирован вручную, или с помощью программы GroundArc TSP или другой программы.


Работа с программой:

1. Запустить программу Point2CAD:


Если в файле присутствует строка заголовок с обозначениями столбцов (см. пример файла №1, первая строка «N X Y H»), то необходимо установить флаг «Пропустить первую строку (заголовок) в исходном файле». Если этого не сделать, то Point2CAD выдаст окно с сообщением об ошибке.


По умолчанию, в Autocad не совпадает направление осей с геодезическими, для этого случая нужно установить флаг «Поменять местами X и Y (для корректного импорта в AutoCAD)».

2. Выбрать файлы для импорта:


3. Преобразовать данные, нажав кнопку «Преобразовать»:


В окне сообщений появится ход процесса преобразования;

В папке с исходными данными появятся документы с расширением *.src;

4. Для импорта в Autocad координат точек, нужно запустить Autocad и выбрать меню «Tool->Run Script»

Затем указать документ *.src с координатами, получившийся в результате работы программы


После чего нажать кнопку «Open» На экране появятся точки, с координатами из загруженного документа

(DWG, DXF). Импортированный текст может быть переведен с применением с использованием переводческих памятей () и глоссариев, что позволяет сэкономить время, необходимое на перевод. Переведенный текст с помощью утилиты TXT2DXF может быть импортирован обратно в чертеж AutoCAD. Утилиты DXF2TXT и TXT2DXF являются утилитами командной строки, крайне просты в применении и обеспечивают эффективные результаты.

Автор програмы : mikegor (Михаил), страничка DXF2TXT и TXT2DXF и контакт с автором

Условия распространения : Бесплатная .

Подробное описание :

Утилиты DXF2TXT и TXT2DXF предназначены для экспорта текста из чертежей AutoCAD (DWG, DXF) и импорта переведенного текста обратно в чертежи. Утилиты DXF2TXT и TXT2DXF являются утилитами командной строки. Поддерживается формат DXF 2004. История программы с 2006 года описана по следующей ссылке: Autocad -> Text -> TM -> Autocad .

Инструкция по использованию

  1. Подготовка чертежа для перевода: нередко в чертежах большой текстовой блок бывает разбит на отдельные блоки типа TEXT. Рекомендуется объединить их в единые блоки MTEXT при помощи Express-Utilities: отмечаем нужные блоки TEXT и затем Express -> Text -> Convert Text to Mtext. Далее чертеж следует экспортировать в формат DXF. Если в чертеже присутствуют объекты, которые трудно экспортировать, то можно собрать в один слой весь текст, нуждающийся в переводе, и экспортировать в DXF только его.
  2. Предположим, что чертежи Machine1.dxf и Machine2.dxf находятся в папке C:\Translate\ZhadinaGovyadina\Project200. Исполняемые файлы утилит dxf2txt.exe и txt2dxf.exe должны быть либо помещены в эту же папку, либо в папку, которая включена в системную переменную PATH. Например, если утилиты находятся в папке C:\Program Files\DXFUtil, то правый клик на "Мой компьютер" - Свойства - Дополнительно - Переменные среды . Там в системных переменных либо в переменных для текущего пользователя находим переменную PATH и в конце дописываем: ;C:\Program Files\DXFUtil (точка с запятой является разделителем разных путей в этой переменной).
  3. Вызываем командную строку: Пуск - Выполнить - cmd . Вводим следующие команды, завершая каждую из них клавишей ENTER :C: cd C:\Translate\ZhadinaGovyadina\Project200
    С: dxf2txt Machine1.dxf Machine2.dxf

    После этого в этой папке появятся файлы Machine1.txt и Machine2.txt. В этих файлах каждый экспортированный текстовой блок имеет формат:

    {n-mmm}
    Текст, текст, текст

    n - число от 1 до 4, обозначающее тип блока MTEXT/TEXT/DIMENSION/ATTDEF, mmm - порядкой номер блока. Блоки разных типов нумеруются отдельно.

  4. Полученные текстовые файлы переводим в любимой программе TM. Так, например, если мы пользуемся Традосом, то импортируем текстовой файл в Word и далее действуем стандартным способом. Структуру файла не следует менять, т.е. нельзя удалять метки блоков и вставлять концы абзацев. Когда перевод готов, экспортируем его обратно в текстовой файл. Пусть, например, исходный файл имеет вид:

    {2-001}
    I have a cat.
    {1-001}
    I like apples.

    Перевод должен выглядеть полностью аналогично:

    {2-001}
    У меня есть кот.
    {1-001}
    Я люблю яблоки.

  5. После этого импортируем перевод обратно в чертеж. Допустим, что переведенные текстовые файлы имеют те же имена, Machine1.txt и Machine2.txt. Тогда в командной строке набираем команду:txt2dxf Machine1.dxf Machine2.dxf

    После этого в текущей папке появятся файлы Machine1_TR.dxf и Machine2_TR.dxf (оригиналы чертежей Machine1.dxf и Machine2.dxf сохраняются). Если имена файлов другие, скажем, Machine1_RU.txt и Machine2_RU.txt, то и DXF-файлы, в которые текст будем импортироваться, надо скопировать в файлы с аналогичными именами Machine1_RU.dxf и Machine2_RU.dxf, а после импорта будут созданы файлы Machine1_RU_TR.dxf и Machine2_RU_TR.dxf.

    Если все было сделано правильно, то переведенные текстовые блоки появятся точно там, где были исходные тексты. Если блоки сбились, то ищите лишние строки в текстовом файле с переводом.

  • CAD/CAM
  • Одним из наиболее популярных вопросов по программированию под nanoCAD является «Как мне импортировать точки из текстового файла?». Задача это несложная, но профессиональный проектировщик не обязан быть профессиональным программистом, поэтому эту статью мы написали в стиле «для начинающих».

    Импортировать координаты в чертёж можно на любом из существующих в nanoCAD видов API. Мы решили выбрать.NET и сравнить два близких API: классический.NET API и кросс-САПР-платформенный MultiCAD.NET API. Под катом - первая часть - импорт точек на классическом.NET API.

    Дано: текстовый файл с координатами X, Y, Z точек, одна точка на строке. Координаты разделены пробелом, разделитель дробной части - точка.

    Требуется: написать приложение, которое по команде IMPORTCOORDS запрашивает имя файла и импортирует найденные координаты в текущее пространство чертёжа в виде объектов DatabaseServices.DBPoint . Координаты объектов должны импортироваться в текущей пользовательской системе координат (UCS) чертежа.

    Создание и настройка рабочего проекта
    Для создания приложения нам понадобятся следующие инструменты:
    • nanoCAD (версия не ниже 3.5)
    • Microsoft Visual Studio 2008 (nanoCAD 3.5 - nanoCAD 5.0 поддерживают загрузку.NET-приложений, построенных на.NET Framework 3.5).
    Ну и, конечно же, подразумевается, что вы хотя бы немного умеете программировать на языке C#. Если нет - добро пожаловать в библиотеку MSDN .

    Создаем новый проект в Visual Studio со следующими настройками:

    • Project type: Visual C#
    • Template: Class Library
    Таким образом, наше приложение представляет собой обычную.NET-сборку (DLL), которая впоследствие будет загружена в nanoCAD.
    Во вкладке References подключаем следующие библиотеки, входящие в состав комплекта nanoCAD:
    • hostdbmgd.dll
    • hostmgd.dll
    Теперь можно смело переходить к написанию самой программы.
    Структура программы
    Реализацию можно разбить на следующие шаги:
    1. Зарегистрировать команду IMPORTCOORDS.
    2. Получить базу данных текущего чертежа и редактор командной строки.
    3. Запросить имя файла с координатами.
    4. Открыть файл, прочитать строки с координатами.
    5. Создать объекты DBPoint с отдельными координатами. Преобразовать их координаты в текущую пользовательскую систему координат.
    6. Добавить созданные объекты в текущее пространство чертежа (Model Space или Paper Space).
    Для того, чтобы зарегистрировать команду, которая будет вызывать наше приложение в nanoCAD нужно перед определением метода, который будет вызываться по этой команде, объявить аттрибут и указать имя команды. Обратите внимание, метод должен иметь модификатор public:

    Public void importCoords() { ... }
    Прежде чем продолжить, хотелось бы остановиться и в двух словах рассказать, что же такое «база данных чертежа». .dwg-файл представляет собой базу данных, имеющую строгую структуру, основные элементы которой - таблицы (Symbol Tables), которые содержат все объекты чертежа. Это не только графические объекты, которые мы видим на чертеже (прямые, дуги, точки и тд.), но и множество других объектов, которые определяют содержимое и настройки чертежа. Например, таблица слоев (Layer Table) содержит в себе все слои, которые имеются на чертеже, таблица типов линий (Linetype Table) хранит все стили линий, определенные в чертеже, таблица пользовательских систем координат (UCS Table) - все системы координат, созданные пользователем для данного чертежа, и др. Таким образом, создать новый объект чертежа - значит создать соответствующий объект базы данных.

    Итак, продолжаем. В первую очередь нам необходимо выбрать из всех открытых документов текущий и открыть его базу данных. Для этого мы получаем объект-менеджер всех открытых документов, и затем с его помощью и базу данных, с которой мы будем дальше работать.

    DocumentCollection dm = Application.DocumentManager; Database db = dm.MdiActiveDocument.Database;
    Для того, чтобы наше приложение запрашивало имя файла, необходимо получить объект Editor и вызвать метод, который запрашивает пользовательский ввод определённого типа (в нашем случае имя файла):

    // Получаем редактор командной строки Editor ed = dm.MdiActiveDocument.Editor; // Объект для получения результата запроса PromptFileNameResult sourceFileName; // Выводим запрос в командную строку и получаем результат sourceFileName = ed.GetFileNameForOpen("\nEnter the name of the coordinates file to be imported:"); if (sourceFileName.Status == PromptStatus.OK) { ... }
    Получить координаты из файла довольно просто, используя C#-функционал для чтения текстовых файлов и работы со строковыми типами данных:

    // Читаем файл, получаем содержимое в виде массива строк string lines = File.ReadAllLines(sourceFileName.StringResult); // Для каждой строки записываем массив из подстрок, разделенных пробелом (т.к по условию задачи в качестве разделителя координат выступает символ пробела). // Таким образом получаем массив из координат, только в текстовом виде, затем конвертируем их в числа типа double. string coord; foreach (string s in lines) { coord = s.Split(new char { " " }); double coordX = Convert.ToDouble(coord); double coordY = Convert.ToDouble(coord); double coordZ = Convert.ToDouble(coord); }
    Переходим к созданию графических примитивов (Entity). Как уже отмечалось выше, для того, чтобы создать любой объект (не только графический), который будет храниться в чертеже, его необходимо добавить в базу данных чертежа, а именно в соответствующий объект-контейнер. Так, например, все слои хранятся как записи в таблице слоев (Layer Table), которая является в этом случае для них объектом-контейнером. Общая структура базы данных выглядит следующим образом:

    Графические примитивы хранятся в базе не напрямую, а в структуре отдельных блоков, которые в свою очередь являются записями в таблице блоков (Block Table). Это очень удобно, поскольку такой механизм позволяет легко группировать объекты в именованные блоки и управлять ими, как единым целым. К слову, пространство модели и пространства листа в базе также представлены отдельными блоками. Таким образом, для графического примитива контейнером будет являться отдельный блок, который, в свою очередь, будет принадлежать родительскому объекту - таблице блоков.

    Раз мы работаем с базой данных, то необходимо обеспечить ее целостность и защиту в случае, если во время выполнения программы произошла какая-то ошибка. Для этой цели применяется механизм транзакций. Транзакции объединяют в себе целый ряд операций, которые выполняются как единое целое: если что-то пошло не так, транзакция отменяется, и объекты, созданные в рамках этой транзакции не будут добавлены в документ. Если же все операции завершились успешно, то транзакция подтверждается, и объекты добавляются в базу.

    Вооружившись этими знаниями, можем смело добавлять в текущее пространство чертежа примитивы «точка» по координатам, которые мы прочитали из файла.

    Using (Transaction tr = db.TransactionManager.StartTransaction()) { // Можно обойтись без таблицы блоков и получить блок текущего пространство чертежа прямо из объекта, представляющего базу данных BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); string lines = File.ReadAllLines(sourceFileName.StringResult); string coord; foreach (string s in lines) { coord = s.Split(new char { " " }); double coordX = Convert.ToDouble(coord); double coordY = Convert.ToDouble(coord); double coordZ = Convert.ToDouble(coord); DBPoint point = new DBPoint(new Point3d(coordX, coordY, coordZ)); btr.AppendEntity(point); tr.AddNewlyCreatedDBObject(point, true); } btr.Dispose(); tr.Commit(); }
    Задача практически решена. Осталось выполнить одно условие: примитивы-точки должны создаваться в координатах пользовательской системы координат (UCS). Необходимо отметить, что примитивы хранятся в базе данных чертежа в мировой системе координат (WCS). Следовательно, при создании примитивов необходимо выполнить преобразование: UCS->WCS. Делается это при помощи матрицы пользовательской системы координат:

    Matrix3d ucsMatrix = ed.CurrentUserCoordinateSystem;
    Добавим преобразование:

    { ... point.TransformBy(ucsMatrix.Inverse()); ... }
    Итак, программа полностью написана. Что же дальше?

    Загрузка приложения в nanoCAD
    Осталась самая приятная часть - загрузить программу в nanoCAD и любоваться результатами своей работы. Как вы помните, мы создавали рабочий проект как библиотеку классов, поэтому после успешной компиляции будет построена сборка с именем вашего проекта. Открываем nanoCAD, в командной строке пишем команду NETLOAD, выбираем из списка построенную библиотеку и загружаем. Для запуска программы просто введите имя команды IMPORTCOORDS в командной строке.
    Импорт координат. Версия 2.0
    Усовершенствуем первую версию приложения, добавив несколько полезных функций и элементы пользовательского интерфейса.

    Если первая версия приложения «понимала» текстовый файл, в котором координаты разделены только пробелами и в качестве десятичного разделителя использовалась точка, то теперь приложение сумеет «распознать» координаты, разделенные символом табуляции, пробелом или точкой с запятой. Что же касается десятичного разделителя, то в качестве него теперь может выступать как точка, так и запятая, импорт будет производиться без учета региональных настроек. По команде IMPORTCOORDS теперь будет открываться модальный диалог импорта координат, в котором пользователь может выбрать файл и указать желаемые настройки импорта координат.

    Общий механизм импорта координат и создания примитивов остается практически без изменений, однако теперь это будет происходить в рамках класса формы, а задача метода-обработчика команды IMPORTCOORDS теперь сводится лишь к созданию объекта формы и выводу формы на экран в виде модального диалога:

    Public void importCoords() { Form form = new ImportForm(); HostMgd.ApplicationServices.Application.ShowModalDialog(form); }
    После чего управление будет передано окну формы импорта координат.

    Форма приложения
    Форма для приложения включает в себя следующие элементы:
    • Кнопка для открытия файла
    • Диалог открытия файла
    • Группа чекбоксов для выбора символов-разделителей координат: табуляция, пробел, точка с запятой
    • Текстовое поле для предварительного просмотра разбора строк c координатами
    • Кнопка для импорта координат
    • Кнопка отмены
    Используя эти элементы управления, пользователь теперь может указать желаемые символы-разделители, проверить результат в поле предварительного просмотра (примерно так, как это сделано в MS Excel при импорте текстового файла) и инициировать импорт координат:

    Совместимость с AutoCAD
    В заключение хотелось бы отметить, что приложение, написанное для nanoCAD, может быть с легкостью перекомпилировано и для работы в AutoCAD. Для этого необходимо сделать следующее:
    • Во вкладке References подключить следующие библиотеки, входящие в состав ObjectARX:
      • AcCoreMgd.dll
      • AcDbMgd.dll
      • AcMgd.dll
    • Добавить в код приложения директиву условной компиляции, для определения пространств имен, которые будут использоваться для компиляции под nanoCAD или AutoCAD:
      #if ACAD using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; using Platform = Autodesk.AutoCAD; using PlatformDb = Autodesk.AutoCAD; #else using HostMgd.ApplicationServices; using HostMgd.EditorInput; using Teigha.DatabaseServices; using Teigha.Geometry; using Teigha.Runtime; using Platform = HostMgd; using PlatformDb = Teigha; #endif
    • Заменить в коде специфичные для каждой платформы пространства имен на определенные выше псевдонимы: Platform и PlatformDb .
    Обе версии проекта доступны