Вставка динамічного блоку з LISP-програми, AutoCAD
Динамічні блоки стали дуже корисними елементами сучасного автокаду. Широке застосування динамічних блоків прискорює процес проектування.
У цьому уроці ми розглянемо, як можна вставлятидинамічний блок і надавати значення його атрибутам із LISP-програми. Для цього нам знадобляться матеріали минулих уроків.
Спочатку ми створимо блоки куба з додатковими даними за допомогою програми, яку ми розглянемо в уроці: « LISP. Створення блоку».
Завантажити програму Mp_kub3.lsp (Розмір файлу: 993 bytes)
Потім витягнемо з блоку додаткові дані.
Вставимо динамічний блок, створений нами в уроці: "Створення динамічного блоку", і внесемо до нього додаткові дані з блоку куба.
Завантажити динамічний блок (Розмір файлу: 30 kB)
І так приступимо:
Відкрийте Редактор Visual LISP , набравши командний рядок VLIDE (або VLISP )
Відкрийте програму mp_kub3, створену в уроці: «LISP. Створення блоку». Див. Рис. 1

Мал. 1. Програма mp_kub3.
Потім на кнопку "Активізація AutoCAD".
Вводимо в командному рядку: mp_kub3 та натисніть Enter >.
На запит « Задайте довжину сторони куба: » введіть 300 та натисніть Enter >
На запит "Вкажіть базову точку:" клацніть мишкою у робочому вікні Автокад.
Програма створить блок куба розмірами сторін 300 .
Повторно запустіть програму (натисніть клавішу Enter >).
На запит « Задайте довжину сторони куба: » введіть 400 та натисніть Enter >
На запит "Вкажіть базову точку:" клацніть мишкою у робочому вікні Автокад.
Програма створить блок куба розмірами сторін 400 .
В результаті отримаємо двакуба, один із сторонами 300 , інший 400 . Див. Рис. 2.

Мал. 2. Створення блоків.
Повернімося до редактора Visual LISP.
Створимо новий файл. Збережемо його під ім'ям Udim.lsp.
Додамо до нього рядок для роботи з функціями, що входять до розширення мови AutoLISP.
Далі за допомогою функції entsel попросимо користувача вибрати блок:
Функція entsel повертає ім'я зазначеного блоку та координату точки вказівки.
За допомогою функції car залишаємо тільки ім'я зазначеного блоку:
Функція car витягує перший елемент зі списку.
За допомогою функції setq зберігаємо ім'я блоку в змінній obj:
Далі перетворимо обраний блок на vla-об'єкт:
Ім'я vla-об'єкта зберігаємо у змінній vla_obj.
Тепер ми можемо отримати додаткові дані, які раніше додавали до блоку.
Для цього використовуємо функцію vlax-ldata-get:
Виділіть весь текст і натисніть кнопку «Завантажити виділений фрагмент». Див. Рис. 3.

Мал. 3. Виймаємо дані з VLA-об'єкта.
На запит « Виберіть блок : » — вкажіть один із двох блоків.
Щоб переглянути значення змінних.
Виділіть змінну V і натисніть кнопку «Додати контрольне значення».
Потім, виділіть змінну ро і знову натисніть кнопку «Додати контрольне значення». Відкриється вікно "Контрольне значення", де можна подивитися, чому рівні змінні. Див. Рис. 4.

Мал. 4. Значення змінних.
Ми бачимо, що нам вдалося отримати дані, які ми додавали до блоку.
Давайте витягнемо ім'я блоку.
За допомогою функції entget отримаємо список із характеристиками примітиву (блоку).
Відкрийте консоль Visual LISP.
Виділіть її та натисніть накнопку «Завантажити виділений фрагмент». Див. Рис. 5.

Мал. 5. Характеристики примітиву.
Функція поверне список:
((-1 .) (0 . «INSERT») (5 . «251») (102 . «») (330 . ) (100 . «AcDbEntity») (67 . 0) (410 . «Model») ( 8. "0") (100. "AcDbBlockReference") (2. "kub400") (10 1485.09 652.573 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0) ) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
Із цього списку нам потрібно витягти ім'я блоку. Ми бачимо, що DXF код імені блоку = 2.
Використовуємо для цього функцію assoc.
Функція assoc застосовується до складного списку, кожен елемент якого починається з коду DXF. Саме з цього коду функція assoc і витягує елемент зі списку.
Їх списку буде вилучено елемент DXF-кодом 2:
Функція поверне таке значення:
Щоб залишити лише ім'я блоку, застосуємо функцію cdr .
Функція cdr повертає список без першого елемента.
Збережемо ім'я блоку змінної bl_name .
Додайте цей рядок, виділіть його, завантажте виділений фрагмент. У вікні консоль Visual LISP з'явиться значення, що повертається – ім'я блоку. Див. Рис. 6.

Мал. 6. Виймаємо ім'я блоку.
Всі необхідні дані ми отримали, тепер можна вставляти наш динамічний блок "Vin".
Я нагадаю, що попередньому уроці («Створення динамічного блоку») ми зберегли його в папці MyLisp: (D: MyLisp Vin.dwg).
Якщо ця папка додана у Вас на шляху підтримки Автокад. У програмі достатньо використовувати ім'я блоку "Vin".
Якщо ні, потрібно використовувати повний шлях до файлу
Як додати папку на шляху підтримки Автокад, показано в уроці «Приклад програми LISP з діалоговим вікном».
Вставляємо динамічний блок:
Додаємо цюрядок і перетворимо нашу програму на користувальницьку функцію defun
В результаті отримаємо. Див. Рис. 7.

Мал. 7. Вставляємо динамічний блок.
Переходимо до Автокаду.
У командному рядку вводимо Udim та натискаємо Enter >.
На запит "Виберіть блок:" - вкажіть один із двох блоків.
Повторіть команду (натисніть клавішу Enter >).
На запит "Виберіть блок:" - вкажіть другий блок.
Програма збудує дві виноски. Див. Рис. 8.

Мал. 8. Текстові виноски.
Ми бачимо, що у блоку kub300 базова точка не потрапила в цент верхньої грані. Це сталося тому, що в момент вставки блоку спрацювала прив'язка "середина відрізка". Тому коли вставляється блок прив'язки, потрібно вимкнути:
Крім цього давайте зробимо так, щоб наша програма нескінченну кількість разів просила вибрати блок, доки ми самі не перервемо її натиснувши Esc >.
Для цього додамо нескінченний цикл.
Якщо користувач при виборі блоку промахнеться та клацне на порожньому місці, програма перерве свою роботу, у командному рядку з'явиться напис:
Тому додаємо умову, яка перевірятиме, щоб змінна obj не дорівнювала nil .
В результаті отримаємо див. рис. 9.

Мал. 9. Додаємо рядки.
Перевіряємо роботу програми.
Видаляємо динамічні блоки.
Переходимо до Автокаду.
У командному рядку вводимо Udim та натискаємо Enter >.
На запит «Виберіть блок:» — спеціально натисніть повз блок. Програма не переривається. Вкажіть один блок.
На наступний запит "Виберіть блок:" - виберіть другий блок.
На наступний запит натисніть Esc >.
Програма збудує дві виноски. Див. Рис. 10

Ми бачимо, щополиці у динамічних блоків трохи закороткі. До того ж полицю біля блоку kub400 не завадило б трохи підняти. Оскільки це динамічні блоки, ми без особливих зусиль можемо зробити це вручну, але все-таки хочеться, щоб це робила програма. Цим ми займемося у наступному уроці.
На закінчення додаємо локальні змінні до списку тимчасових змінних функцій defun. Див. Рис. 11.

Мал. 11. Додаємо локальні змінні.
Завантажити програму Udim.lsp (Розмір файлу: 538 bytes)
На цьому наш урок закінчено.
У наступному уроці ми розглянемо, як із LISP-програми змінювати геометричні характеристикидинамічного блоку.
Чи важко було виконати цей урок?
Чи була для Вас корисною інформація, дана в цьому уроці?
На які питання програмування, Ви хотіли б побачити відповіді в наступних уроках?
Я із задоволенням відповім на ваші запитання.
Якщо ви бажаєте отримувати новини з мого сайту. Оформляйте передплату.