Вмъкване на динамичен блок от LISP програма, AutoCAD
Динамичните блокове са станали много полезни елементи на съвременния AutoCAD. Широкото използване на динамични блокове значително ускорява процеса на проектиране.
В този урок ще разгледаме как можете да вмъкнетединамичен блок и да присвоите стойности на неговите атрибути от LISP програма. За целта са ни необходими материали от предишни уроци.
Първо, ще създадем кубични блокове с допълнителни данни, като използваме програмата, която обсъдихме в урока: „LISP. Създаване на блок.
Изтеглете програмата Mp_kub3.lsp (Размер на файла: 993 байта)
След това извличаме допълнителни данни от блока.
Нека да вмъкнем динамичния блок, който създадохме в урока: „Създаване на динамичен блок“, и да добавим допълнителни данни от кубичния блок към него.
Изтегляне на динамичен блок (Размер на файла: 30 kB)
И така, нека да започнем:
Отворете Visual LISP Editor, като напишете VLIDE (или VLISP) в командния ред
Отворете програмата mp_kub3, създадена в урока: „LISP. Създаване на блок. Вижте фиг. 1
Ориз. 1. Програма mp_kub3.
След това кликнете върху бутона "Активиране на AutoCAD".
Въведете в командния ред: mp_kub3 и натиснете Enter >.
При подканата „Посочете дължината на страната на куба:“ въведете 300 и натиснете Enter >
На заявката "Посочете базовата точка:" щракнете с мишката в работния прозорец на AutoCAD.
Програмата ще създаде кубичен блок със странични размери 300 .
Стартирайте програмата отново (натиснете Enter >).
При подканата „Посочете дължината на страната на куба:“ въведете 400 и натиснете Enter >
На заявката "Посочете базовата точка:" щракнете с мишката в работния прозорец на AutoCAD.
Програмата ще създаде кубичен блок със странични размери 400 .
В резултат на това получаваме двекуб, единият със страни 300 , другият 400 . Вижте фиг. 2.
Ориз. 2. Създаване на блокове.
Нека се върнем към Visual LISP Editor.
Нека създадем нов файл. Нека го запазим като Udim.lsp.
Нека добавим ред към него, за да работим с функциите, включени в езиковото разширение AutoLISP.
След това, използвайки функцията entsel, ще помолим потребителя да избере блок:
Функцията entsel връща името на посочения блок и координатата на точката на избор.
Използвайки функцията car, оставяме само името на посочения блок:
Функцията car извлича първия елемент от списъка.
Използвайки функцията setq, съхраняваме името на блока в променливата obj:
След това преобразуваме избрания блок във vla обект:
Името на vla обекта се съхранява в променливата vla_obj.
Сега можем да извлечем допълнителните данни, които преди това добавихме към блока.
За да направим това, използваме функцията vlax-ldata-get:
Изберете целия текст и щракнете върху бутона „Зареждане на селекцията“. Вижте фиг. 3.
Ориз. 3. Извлечете данни от VLA обекта.
Към заявката "Избор на блок:" - посочете един от двата блока.
За да видите стойностите на променливите.
Изберете променливата V и щракнете върху бутона "Добавяне на контролна стойност".
След това изберете променливата rho и щракнете отново върху бутона Add Watch. Ще се отвори прозорецът за наблюдение, където можете да видите на какво са равни променливите. Вижте фиг. 4.
Ориз. 4. Стойности на променливите.
Виждаме, че успяхме да получим данните, които преди това добавихме към блока.
Нека извлечем и името на блока.
Използвайки функцията entget, получаваме списък с характеристиките на примитив (блок).
Отворете конзолата Visual LISP.
Изберете го и щракнете върхубутона Load Selection. Вижте фиг. 5.
Ориз. 5. Характеристики на примитива.
Функцията ще върне списък:
((-1 . ) (0 . "INSERT") (5 . "251") (102 . "") (330 . ) (100 . "AcDbEntity") (67 . 0) (410 . "Модел") (8 . "0") (100 . "AcDbBlockReference") (2 . "kub400") (10 1485,09 6 52,573 0,0) (41 , 1,0) (42 , 1,0) (43 , 1,0) (50 , 0,0) (70 , 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. Извлечете името на блока.
Получихме всички необходими данни, сега можем да вмъкнем нашия динамичен блок „Vyn“.
Напомням ви, че в предишния урок („Създаване на динамичен блок“) го записахме в папката MyLisp: ( D:\MyLisp\Vyn.dwg ).
Ако тази папка е добавена към вашия път за поддръжка на AutoCAD. В програмата е достатъчно да използвате името на блока „Vyn“.
Ако не, тогава трябва да използвате пълния път до файла
Как да добавите папка към пътеката за поддръжка на AutoCAD е показано в урока "Пример за LISP програма с диалогов прозорец".
Вмъкване на динамичен блок:
Добави Товаред и преобразувайте нашата програма в персонализирана функция defun
В резултат на това получаваме. Вижте фиг. 7.
Ориз. 7. Вмъкване на динамичен блок.
Да отидем на AutoCAD.
В командния ред въведете Udim и натиснете Enter >.
Към заявката "Избор на блок:" - посочете един от двата блока.
Опитайте отново командата (натиснете Enter >).
Към заявката "Изберете блок:" - посочете втория блок.
Програмата ще изгради две допълнителни описания. Вижте фиг. 8.
Ориз. 8. Текстови надписи.
Виждаме, че основната точка на блока kub300 не е ударила центъра на горната страна. Това се случи, защото в момента на вмъкване на блока се задейства свързването "средата на сегмента". Следователно, когато анкерният блок е поставен, той трябва да бъде деактивиран:
В допълнение, нека накараме нашата програма да ни помоли да изберем блок безкраен брой пъти, докато сами не го прекъснем с натискане на Esc >.
За да направим това, нека добавим безкраен цикъл.
Ако потребителят, когато избира блок, пропусне и щракне върху празно място, програмата ще прекъсне работата си, надписът ще се появи на командния ред:
Следователно добавяме условие, което ще провери дали променливата obj не е равна на nil.
В резултат на това получаваме вижте фиг. 9.
Ориз. 9. Добавете линии.
Проверяваме работата на програмата.
Премахнете динамичните блокове.
Да отидем на AutoCAD.
В командния ред въведете Udim и натиснете Enter >.
Към заявката „Изберете блок:“ - специално щракнете върху блока. Програмата не се прекъсва. Посочете един блок.
При следваща заявка "Избор на блок:" - изберете втория блок.
При следващата подкана натиснете Esc >.
Програмата ще изгради две допълнителни описания. Вижте фиг. 10
Виждаме товарафтовете на динамичните блокове са малко къси. В допълнение, рафтът в блока kub400 няма да навреди да се повдигне малко. Тъй като това са динамични блокове, можем лесно да направим това ръчно, но все пак искаме програмата да направи това. Това ще направим в следващия урок.
Накрая добавяме локални променливи към списъка с временни променливи във функцията defun. Вижте фиг. единадесет.
Ориз. 11. Добавяне на локални променливи.
Изтеглете Udim.lsp (Размер на файла: 538 байта)
Това приключва нашия урок.
В следващия урок ще разгледаме как да променим геометричните характеристики надинамичен блок от LISP програма.
Беше ли трудно да завършите този урок?
Беше ли ви полезна информацията, дадена в този урок?
Какви въпроси по програмиране бихте искали да видите отговор в бъдещи уроци?
С удоволствие ще отговоря на вашите въпроси.
Ако искате да получавате новини от моя сайт. Абонирай се.