266.97K

Сложные составные объекты. Программирование в nanoCAD, .NET API. Модуль 2

1.

Программирование в nanoCAD, .NET API
Модуль 2
Сложные составные
объекты

2.

Рассматриваемые вопросы
1. Блоки с точки зрения программиста
2. Полилинии и сети с точки зрения программиста
3. Размеры с точки зрения программиста

3.

Блоки
1. Пользовательские блоки
2. Служебные блоки
Модель, листы
Представление размеров
Представление штриховок
Внешние ссылки
Имена служебных блоков начинаются с символа * (звездочка),
такие блоки не показывают диспетчер чертежа и команда INSERT.

4.

Определение и вставка блока
Блок состоит из двух объектов:
1. Неграфической части (Object), определения BlockTableRecord,
2. Графической части (Entity), вставки BlockReference.
Определения блоков расположены в таблице блоков BlockTable.
Вставки блоков, как и любые другие примитивы, содержатся в
других блоках, например, в служебном блоке *Model_Space.

5.

Привычные команды и блоки
BLOCK. Создает определение блока из примитивов, удаляет их,
вместо них добавляет в базу данных чертежа вставку блока.
INSERT существующего блока добавляет в базу данных чертежа
вставку блока.
INSERT блока из внешнего файла, создает определение блока,
имя которого задается по имени вставляемого файла,
содержимым определения блока становится *Model_Space
внешнего файла. Далее вставка идет по пути «блок существует».
COPY. При копировании вставки блок, копируется только вставка
блока, новая вставка ссылается на то же определение, что и
исходный блок.
PURGE. Удаляет определения блоков, если у них нет вставок.

6.

Таблица блоков
Класс BlockTable – наследник IEnumerable.
Алгоритм перебора таблицы блоков:
1. Получить ObjectId таблицы блоков Database.BlockTableId.
2. Открыть объект BlockTable на чтение
Transaction.GetObject().
3. Перебрать элементы при помощи оператора foreach.
Переменная BlockTableRecord.Name содержит имя блока.
Переменная BlockTableRecord.Handle.Value содержит
значение Handle.
Упражнение (TODO 2.1.1 Blocks.cs): Доработать команду
HelloBlockTable, вывести в командную строку список всех блоков
чертежа и их handle.

7.

Вставка блока из внешнего файла
Алгоритм вставки блока:
1. Создать базу данных исходного чертежа, для чего создать объект
Database, загрузить в него исходный файл при помощи
Database.ReadDwgFile().
2. В результирующей базе данных вызвать метод
Database.Insert(), указав имена исходного и результирующего
блоков.
3. Удалить из памяти исходную базу данных, вызвав Dispose().
Упражнение (TODO 2.1.2 Blocks.cs): Доработать команду
HelloInsertBlock, которая запрашивает у пользователя имя файла
и вставляет его блок *Model_Space в текущий чертёж как новый блок.
Результат можно проверить с помощью команды HelloBlockTable.

8.

Перебор содержимого блока
Класс BlockTableRecord – наследник IEnumerable.
Алгоритм:
1. Перебрать ObjectId объектов блока при помощи оператора
foreach.
2. Открыть объект при помощи Transaction.GetObject()
Команда HelloBlockIterator перебирает блок *Model_Space
выводит в командную строку тип и handle объектов.
Упражнение (TODO 2.1.3 Blocks.cs): Доработать команду
HelloBlockIterator, добавить запрос имени блока у
пользователя и вывести тип и Handle объектов .

9.

Атрибуты
Атрибут – примитив AttributeDefinition, как и другие
примитивы, добавляется в определение блока при его создании
(или редактировании, программном или при помощи команды
BEDIT).
При вставке блока, атрибуты превращаются в примитивы
AttributeReference и наполняются конкретными значениями,
своими для каждой вставки.
Получить доступ к коллекции атрибутов можно при помощи
свойства BlockReference.AttributeCollection.
AttributeCollection – это коллекция ObjectId примитивов
AttributeReference.

10.

Перебор атрибутов
Класс AttributeCollection – наследник IEnumerable.
Упражнение (TODO 2.1.4):
Доработать команду HelloBlockAttributes, которая выводит в
командную строку значения атрибутов выбранного блока.
attRef.Tag - тэг(название) атрибута
attRef.TextString – значение атрибута
Подсказка: Для выбора одного примитива удобней использовать
Editor.GetEntity() вместо Editor.GetSelection().

11.

Виды полилиний
Polyline, 2D полилиния, один объект, содержащий точки.
Polyline3d, 3D полилиния, каждая точка представлена отдельным
объектом PolylineVertex3d.
«Старая» 2D полилиния Polyline2d, устроена так же, как и Polyline3d.
Но заменена на Polyline по соображениям производительности.
В AutoCAD создание и преобразование старых полилиний в новые
управляется системной переменной PLINETYPE.
В nanoCAD 20 (и более ранних версиях) значение PLINETYPE не
учитывается, полилинии открываются как есть без преобразования,
создаются всегда примитивы типа Polyline.

12.

Полилинии. Упражнения (Polylines.cs)
Упражнение(TODO 2.2.1): Доработать команду HelloPolylineDump,
вывести в командную строку список узлов 2D полилинии. Перед
выполнением команды создать 2D полилинию вручную командой
PLINE.
Упражнение (TODO 2.2.2): Доработать команду HelloPline, добавить
2D полилинию в чертёж программно, запросив у пользователя
несколько точек.
Упражнение (TODO 2.2.3): Создать 3D полилинию вручную командой
3DPOLY. Доработать команду HelloPolyline3dDump, вывести в
командную строку список узлов 3D полилинии.
Упражнение (TODO 2.2.4): Доработать команду Hello3DPoly, добавить
3D полилинию в чертеж программно, запросив у пользователя
несколько точек.

13.

Сети
1. SubDMesh – один объект,
реализация метода Catmull-Clark Subdivision Surface
Команда: 3D, сфера, тор и т.п.
2. PolygonMesh – регулярная сеть, множество связанных
объектов-вершин, как в 3D полилинии
Команда: 3DMESH
3. PolyfaceMesh – нерегулярная сеть, множество связанных
объектов-вершин, как в 3D полилинии
Команда: PFACE

14.

Размеры
1. Стили размеров DimStyleTableRecord расположены в
таблице DimStyleTable, которую можно получить при
помощи Database.DimStyleTableId.
2. Размер в чертеже ссылается на стиль размера.
3. Графика размера отображается при помощи служебного блока
«*Dxxx», где xxx – произвольное число.

15.

Стиль размера, системные переменные
Они же свойства класса DimStyleTableRecord
Они же свойства класса Database (переопределяют текущий
стиль)
Dimadec
Dimalt
Dimaltd
Dimaltf
Dimaltrnd
Dimalttd
Dimalttz
Dimaltu
Dimaltz
Dimapost
Dimasz
Dimatfit
Dimaunit
Dimazin
Dimblk
Dimblk1
Dimblk2
Dimcen
Dimclrd
Dimclre
Dimclrt
Dimdec
Dimdle
Dimdli
Dimdsep
Dimexe
Dimexo
Dimfrac
Dimgap
Dimjust
Dimldrblk
Dimlfac
Dimlim
Dimlunit
Dimlwd
Dimlwe
Dimpost
Dimrnd
Dimsah
Dimscale
Dimsd1
Dimsd2
Dimse1
Dimse2
Dimsoxd
Dimtad
Dimtdec
Dimtfac
Dimtih
Dimtix
Dimtm
Dimtmove
Dimtofl
Dimtoh
Dimtol
Dimtolj
Dimtp
Dimtsz
Dimtvp
Dimtxsty
Dimtxt
Dimtzin
Dimupt
Dimzin
Dimfxl
Dimfxlon
Dimjogang
Dimtfill
Dimtfillclr
Dimarcsym
Dimltype

16.

Размеры, упражнения (Dimensions.cs)
Упражнение(TODO 2.3.1): Доработать
команду HelloDimStyle, установить в
стиле NewStandard, используя свойства
newDimStyleTableRecord :
1.
2.
Масштаб 1:1000
(переменная DIMSCALE),
Точность до целых
(переменная DIMDEC).
Внимание! При проверке размерного
стиля путем создания размеров
вручную, использовать AutoCADсовместимые команды создания
размеров DIMLINEAR, DIMALIGNED и
т.п. Эти команды не вынесены на
ленту/в меню.

17.

Размеры, упражнения
Упражнение(TODO 2.3.2): Создать команду HelloRectDim,
создающую прямоугольник с размерами по двум соседним
сторонам.
1.
2.
3.
4.
Запросить угловые точки.
Создать объект Polyline в виде прямоугольника.
Создать объекты RotatedDimension зеленого цвета.
Сравнить вывод команды HelloBlockTable до и после запуска
команды HelloRectDim.

18.

Резюме
Изучены основы работы с блоками, полилиниями, размерами.
ВОПРОСЫ?

19.

Бонус
TODO B2.1 (Blocks.cs): Добавить в команду вставки блока
диалоговый запрос имени файла (FileOpenDialog).
TODO B2.2 (Polylines.cs): Добавить в команду создания полилинии
ключевое слово «Замкнуть» (с третьей точки).
TODO B2.3 (Dimensions.cs): Добавить в команду создания
размерного стиля проверку существования этого стиля.
TODO B2.4 (Dimensions.cs): Доработать команду HelloRectDim,
обеспечить создание размеров вне прямоугольника для любого
относительного положения первой и второй точки.
English     Русский Правила