Описаните по-долу функции извършват операции, които са в директна връзка с имената на елементите. Имената на елементите могат да се въвеждат след въпроса на AutoCAD "Select objects:" и то тогава, когато е позволен избор "Последен". Назованите обекти се избират с прозорец.
2.3.1 (entnext [<име на елемент>])
Ако се извика без аргументи, тази функция дава името на първия изтрит елемент в базата данни. Ако ENTNEXT се извика с <име на елемент>, извежда се името на първия неизтрит елемент, който следва <име на елемент> в базата данни. Ако не съществува следващ елемент в базата данни, резултатът е Nil. ENTNEXT дава както главни, така и поделементи.
Избраните от SSGET елементи са главни, а не атрибути на блокове или върхове на полилинии. ENTNEXT позволява достъпа до вътрешната структура на тези комплексни елементи. Едва след като сте получили името на един поделемент, той може да се обработва като всеки друг. Ако сте получили името на поделемент с ENTNEXT, можете да намерите елемента на по-високо ниво, като продължите с ENTNEXT, докато се намери SEQEND-елемент. Извлечете сега групата "-2" на този елемент, която съответства на името на главния елемент.
Пример:
(setq e1 (entnext)) дава името на I елем.E1 на чертежа
(setq e2 (entnext e1)) дава името на елем.E2, следващ E1
2.3.2 (entlast)
Тази функция дава като резултат името на последния неизтрит главен елемент в базата данни. Често се използва за получаване името на нов елемент, който току-що е бил вмъкнат с функцията COMMAND. Елементът трябва да се намира или на монитора, или на размразен слой, за да може да бъде избран.
Пример:
(setq e1 (entlast)) дава името на посл.елем.E1 на чертежа
(setq e2 (entnext e1)) поставя E2 на Nil
2.3.3 (entsel [<въпрос>])
При операции, касаещи елементи, често е желателно да се избере елемент и едновременно да се специфицира точката, с която е избран елемента. Захватът на обект и командите BREAK, TRIM и EXTEND са примери от AutoCAD за това. Функцията ENTSEL позволява на AutoLISP-програмите да извършват тези операции. ENTSEL избира един единствен елемент чрез посочване на точка. Тя дава списък, чийто първи елемент е името на избрания елемент и втори елемент са координатите на точката, която е използвана за посочване на елемента. Ако за <въпрос> е специфициран символен низ, той пита потребителя за елемента. В противен случай се използва резервния въпрос "Select objects:".
Пример:
Command: LINE
From point: 1,1
To point: 6,6
To point (RETURN)
Command: (setq e (entsel "Моля, изберете елемент: "))
Моля, изберете елемент: 3,3
( (3.000000 3.000000))
Списък, който се дава от ENTSEL, може да бъде въведен при някакво запитване на AutoCAD за избор на обект. AutoCAD третира това въвеждане като избиране на елемент чрез посочване.
Функции по отношение данните за елементи
Следващите функции позволяват модификацията и достъпа до данни, които дефинират един елемент. Всички тези функции използват името на елемента, за да определят елемента, който ще се обработва.
2.4.1 (entdel <име на елемент>)
Специфицираният <име на елемент> се изтрива, ако се намира в действащия чертеж и се връща отново в чертежа, ако по-рано е бил изтрит в това работно състояние. Изтритите елементи се изчистват от чертежа, ако бъде напуснат чертожния редактор. Следователно ENTDEL може да връща само обекти, които са изтрити в актуалното работно състояние. ENTDEL може да се прилага само за главни елементи - атрибути и върхове на полилинии не могат да се изтриват, независимо от принадлежащите им елементи от по-високо ниво. ( С функцията COMMAND за тази цел могат да се използват командите на AutoCAD ATTEDIT и PEDIT.)
Пример:
(setq e1 (entnext)) дава името на I елемент E1 на чертежа
(entdel e1) изтрива елемента E1
(entdel e1) връща изтрития елемент E1
2.4.2 (entget <име на елемент>)
Извиква <име на елемент> от базата данни и го представя като списък, който съдържа неговите дефиниционни данни. Резултатът е кодиран като асоциативен списък на AutoLISP, от който лесно могат да бъдат извикани съставните части с функцията ASSOC. Обектите от резултантния списък са кодирани с AutoCAD-DXF-код на група за всяка част от данните на елемента.
Пример 1:
Command: LINE
From point: 1,1
To point: 6,6
To point (RETURN)
Command: (setq a (entget (entlast))) присвоява A на списъка
((-1 , )
(0 , "LINE")
(8 , "0")
(10 , 1.000000 2.000000)
(11 , 6.000000 6.000000)
) отстъпът е даден за прегледност
Съставната част "-1" в началото на списъка съдържа името на елемента, който се представя чрез този списък. Функцията ENTMOD (описана по-долу) използва тази съставна част за да идентифицира модифицирания елемент.
Отделните точкови двойки, които представят стойностите, могат да се изведат лесни с ASSOC, при което стойностите могат да се извличат с CDR. Кодовете на компонентите на елемента са тези от DXF, които са документирани в Приложение C от РЪКОВОДСТВОТО на AutoCAD. Както при DXF съставните части на елемента от Header-секцията се извеждат само, ако не съответстват на резервните стойности. Противно на DXF, полетата за дефиниране на елементи, които се указват по желание, се извеждат независимо дали са равни или не на техните резервни стойности. ЧРез това правило обработването на програмата се улеснява.
Подсписъците от точки не са точкови двойки като остатъка. Условието определя, че CDR на подсписъка представя груповата стойност. Тъй като една точка е списък от 2 реални числа, цялата група е списък от 3 елемента. CDR на групата е списък, който представя точката, с което се запазва условието, че CDR винаги дава стойността.
Когато се пишат функции за обработване на списъци от елементи, те трябва да се правят в обратен ред на подсписъците. Това се осигурява с използването на ASSOC. Групата "-1", която съдържа името на елемента, позволява модификационни операции и списъкът да се приема лесно, чрез което се избягва управлението на името на елемента в паралелна структура. Еди SEQEND-елемент на края на полилиния или на атрибутен запис съдържа група "-2", чието CDR е името на елемента на Header-реда на този елемент. По този начин може да се намери Header-а вътре в поделемент, като този е стигнал до SEQEND, след което се използва CDR на група "-2" като име на елемент, за да се локализира съответния главен елемент.(???)
Пример 2:
Command: ELEV
New current elevation<0.000>: 3.5
New current thickness<0.000>: 0
Command: LINETYPE
?/Create/Load/Set: S
New entity linetype: GESTRICHELT
Command: COLOR
New entity color: BLUE
Command: LAYER
?/Make/Set/New/ON/OFF/Color/LType/Freeze/Thaw/LOck/Unlock: MAKE
New current layer<0>: AN
?/Make/Set/New/ON/OFF/Color/LType/Freeze/Thaw/LOck/Unlock: SET
New current layer: (RETURN)
?/Make/Set/New/ON/OFF/Color/LType/Freeze/Thaw/LOck/Unlock(RETURN)
Command: TEXT
Justify/SStyle/: 2,2
Height<0.00>: 0.3
Rotation angle<0.00>: 30
Text: Текстът има печатни грешки !
Command: (setq e (entget (entlast))) E се присвоява на списъкът:
((-1 , )
(0 , "TEXT")
(8 , "AN")
(6 , "GESTRICHELT")
(62 , 5)
(38 , 3.500000)
(10 2.000000 2.000000)
(40 , 0.300000)
(1 , "Текстът има печатни грешки !")
(50 , 0.523598)
(41 , 1.000000)
(51 , 0.000000)
(7 , "STANDARD")
(71 , 0)
(72 , 0)
(11 2.000000 0.000000)
)
2.4.3 (entmake )
Създава нови елементи.
Пример: (Нека да създадем окръжност с център (2,3,0) и радиус 1.5.)
(entmake ‘((0 , "CIRCLE")
(10 2.0 3.0 0.0)
(40 1.5))
)
2.4.4 (entmod )
ENTMOD съдържа списък () във формат, който се дава като резултат от ENTGET и довежда информацията от базата данни за елемента, чието име е определени чрез група "-1" в , в най-ново състояние. Процесът на направляване на базата данни в AutoLISP изглежда така:
с ENTGET се извикват елементи. Списъкът, който съдържа елемента се модифицира (SUBST служи за тази цел), след което елементът се въвежда в базата данни с ENTMOD.
Пример:
(setq en (entnext)) дава името на I елемент EN на чертежа
(setq ed (entget en)) присвоява ED на данните за елементи за име на елемент EN
(setq ed (subst (cons 8 "0")
(assoc 8 ed) променя Layer-групата в ED
ed)) на слой "0"
(entmod ed) модифицира слоя на EN в чертежа
ENTMOD има някои ограничения по отношение на промените, които се предприемат. Типът на елемента не може да се променя. За тази цел трябва да изтриете елемента с ENTDEL и след това да създадете нов елемент с COMMAND. Всички обекти, за които се извлича информация от списъка, трябва да са познати на AutoCAD, преди да се изпълни ENTMOD. Имена на текстови шрифтове, типове линии, символи и блокове трябва да са модифицирани предварително в чертежа, преди да се използват в списък с ENTMOD. Изключение правят имената на слоеве - ENTMOD създава нов слой със стандартните - резервни стойности, както са използвани от командата LAYER "NEW", ако предварително се дава име на недефиниран слой в елементния списък.
Ако полетата на елемента се модифицират със стойности с плаваща запетая, както например групите "38"(елевация) и "39"(дебелина на обекта), трябва като нова стойност да се въведе реално число. Ако специфицирате цяло число, ще получите грешни резултати.
ENTMOD проверява списъка по същия начин, както DXF-данните от един DXF-файл. Ако бъде открита сериозна грешка, която пречи на направляването на базата данни, резултатът е Nil. В противен случай ENTMOD дава като резултат списъка. ENTMOD не променя вътрешни полета, като например името на елемента в група "-2" на един SEQEND-елемент. Опитите да се променят такива полета се игнорират.
Ако се направлява главен елемент, ENTMOD модифицира елемента и извежда неговия изглед на монитора (включително поделементи). Ако се използва ENTMOD за направляване на поделемент, неговите данни се въвеждат в базата данни, но на монитора не се появява нов изглед на елемента. След като е модифициран поделемент, долуописаната функция ENTUPD може да се използва за извеждане на изгледа на монитора.
2.4.5 (entupd <име на елемент>)
Както вече споменахме, модифициран с ENTMOD елемент няма да се изведе на екрана. Например, ако трябва да се модифицират 100 върхови точки на полилиния, при което ако след всяко ново изчисление трябваше да се изобразява полилинията, този процес би бил много бавен. Функцията ENTUPD може да се използва за извеждане на модифицирана полилиния или модифициран блок на монитора. ENTUPD се извиква с името на някаква част от полилиния или блок. При това не се касае за Header-елемента - ENTUPD сам търси този елемент. ENTUPD е замислен точно за полилинии и блокове с атрибути, но може да се използва за извикване на произволен елемент. Във всички случаи елементът ще се регенерира на екрана заедно с поделементите си. Да приемем, че първият елемент в чертежа е полилиния с различни върхове:
Пример:
(setq e1 (entnext)) дава E1 на името на елемент на полилинията
(setq e2 (entnext e1)) дава E2 на първата върхова точка
(setq ed (entget e2)) дава ED на данните за върхове
(subst ‘(10 1.0 2.0)
(assoc 10 ed) променя местоположението на върха в ED
ed) на точка 1,2
)
(entmod ed) премества върховата точка в чертежа
(entmod e1) регенерира елемента-полилиния E1
2.4.6 Ограничения
Имената на елементи и множествата от избрани обекти са действащи само за това състояние на редактиране, в което са били създадени от AutoCAD. Ако опитате да изпълните една от следните операции, докато са активни командите PLINE или ATTEDIT, резултатът ще е Nil и извиканата функция няма да се изпълни:
ENTMOD - модифициране на съществуващ елемент
ENTUPD - регенериране на модифициран комплексен обект
ENTDEL - извеждане и регенериране на изтрит елемент
Използване имената на елементи и множествата от избрани обекти в AutoCAD
Имената на елементи и множествата от избрани обекти се въвеждат като данни от AutoLISP на въпросите на AutoCAD за избор на обект. Затова назованите от AutpLISP елементи могат да се обработват от командите на AutoCAD. На въпроса "Select objects:" AutoLISP може да зададе името на елемента, с което се определя един единствен елемент или множество от избрани обекти, което определя всички елементи в този запис. Това е в сила винаги, когато се поддържа опцията "Last".
Винаги, когато AutoCAD допуска избор чрез посочване на обекти, от процедурата за избор се приемат списъци във формата, както се дават от ENTSEL. Елементът се избира от списъка, при което точката в списъка се определя като точка, с която е посочен елемента. AutoLISP може да задава такива точки на елементи на команди като BREAK, TRIM или EXTEND. Списъци с формата на ENTSEL могат да се използват за други видове избор, докато командата поддържа избор чрез посочване (обектът се посочва с точка). ENTSEL-списъци не могат да се използват с командите FILLET и CHAMFER, тъй като те изискват 2 елемента и точки.
Забележки при обработването на крива и сплайн за полилинии
Ако търсите върховите точки на полилиния с ENTNEXT, възможно е да се натъкнете на определен брой върхови точки, които не сте създали явно. Тези помощни точки се вмъкват автоматично от опциите "Крива" и "Сплайн" на командата PEDIT. Вероятно искате да игнорирате тези точки, тъй като промените на тези върхови точки ще бъдат загубени при следващото използване на опциите "Крива" и "Сплайн".
По флаговете на група "70" може да се познае дали полилинията е обработена с "Крива" (ст.на бит 2) или "Сплайн" (ст.на бит 4). В случай, че никой от тези битове на е зареден, всички върхови точки на полилинията са нормални. Ако обаче битът за "Крива" (2) е зареден, върховите точки на полилинията притежават редувайки се стойност на бит 1 в тяхната група "70" и с това показват, че те са вмъкнати с "Крива". Ако използвате ENTMOD за преместване на върховите точки на такава полилиния и имате намерение отново да закръглявате кривата с PEDIT, най-добре е да игнорирате тези върхови точки.
Същото е в сила, когато флаг-битът на една полилиния е зареден със "Сплайн" (4). Предварително ще намерите различни върхови точки, някои със стойност на флаг-бит 1 (вмъкнати с "Крива", когато системната променлива SPLINESEGS е отрицателна), някои със стойност на бит 8 (вмъкнати със "Сплайн") и други със стойност на бит 16 (контролни точки на рамката на кривата). Също и тук е в сила - ако искате да преместите върховите точки с ENTMOD и имате намерение да създадете нова крива, най-добре е да преместите върховите точки.
Достъп до таблицата със символи
За да се четат таблиците със символи на AutoCAD за слоеве, тъп линии, именовани сектори, шрифтове и дефиниции на блокове, са въведени новите AutoLISP-функции TBLNEXT и TBLSEARCH.
2.6.1 (tblnext <име на таблица> [<първи>])
Тази функция се използва за претърсване на цяла таблица от символи. Първият аргумент е символен низ, който идентифицира желаната таблица. Валидни имена на таблици са: "LAYER", "LTYPE", "VIEW", "STYLE" и "BLOCK". Символният низ не трябва да се записва с главни букви. Ако е налице втори аргумент и се оценява на стойност, различна от Nil, таблицата се навива в обратна посока и се намира първия запис. В противен случай се намира следващия запис. Ако няма други записи в таблицата, резултатът е Nil. Изтрити записи от таблицата никога не се връщат. Един намерен запис се представя като списък от точкови двойки, от кодове и стойности на типа DXF, подобно на тези, които се дават от функцията ENTGET.
Пример 1:
(tblnext "layer" T) намиране на първи слой
Това въвеждане би довело до следното:
((0 , "LAYER") тип на символа
(2 , "0") име на символа
(70 , 0) флагове
(62 , 7) номер на цвят (отрицателен, ако е off
(6 , "CONTINUOUS") име на тип линия
)
Забележете, че за разлика от списъците с данни за обекти, тук няма група "-1". AutoCAD записва от всяка таблица последния изведен запис и дава като резултат при извикване на TBLNEXT за тази таблица просто следващия запис. Преди да претърсвате една таблица, осигурете се, следващият аргумент да е различен от Nil, за да започне търсенето в таблицата отгоре и резултатът наистина да е първия запис.
Записи, намерени в таблицата "BLOCK", съдържат група "-2" с "име на обект" на първия обект в дефиницията на блока (ако изобщо има такава).
Пример 2 (за блок "BOX"):
(tblnext "block") намиране на дефиниция на блок
би дал следното:
((0 , "BLOCK") тип на символа
(2 , "BOX") име на символа
(70 , 0) флагове
(10 9.000000 2.000000 0.000000) изходна точка X,Y,Z
(-2 , ) първи обект
)
Името на обекта в група "-2" се приема от ENTGET и ENTNEXT, обаче не и от други функции, които имат достъп до обекта. Те не могат да модифицират такъв обект с ENTMOD или с SSADD и ENTSEL да го вмъкнат в множеството от избрани обекти. От това, че името на обекта се задава в група "-2" на функцията ENTNEXT, могат да бъдат претърсвани обектите, които се съдържат в една дефиниция на блок. ENTNEXT дава Nil след последния обект в дефиницията на блока.
2.6.2 (tblsearch <име на таблица> <символ>)
Тази функция претърсва таблицата със символи, която се идентифицира от <име на таблица> (като при TBLNEXT) и търси името на символа, което е специфицирано чрез <символ>. Двете имена автоматично се превръща в главни букви. Ако се намери запис за дадено име на символ, този запис се дава във формат, който се описва от TBLNEXT. Ако не се намери такъв запис, резултатът е Nil.
Пример:
(tblsearch "style" "standard") намиране на шрифт
Това би довело до следното:
((0 , "STYLE")
(2 , "STANDARD")
(70 , 0)
(40 , 0.000000)
(41 , 1.000000)
(50 , 0.000000)
(71 , 0)
(3 , "txt")
(4 , "")
)
Последователността от намерени от TBLNEXT записи не се влияе от TBLSEARCH.
Достъп до графичния монитор и входните устройства
Описаните в този раздел AutoLISP-функции позволяват директен достъп от AutoLISP до графичния монитор на AutoCAD и входното устройство. Те позволяват на потребителя да използва внедрени AutoLISP-команди като AutoCAD-команди. Тези команди могат да предизвикат безредие на екрана. Евентуални смущения могат да се снижат със следната последователност от команди:
(grtext)
(redraw)
Тези функции могат да се прилагат само от опитни специалисти. Повечето приложения на AutoLISP не изискват тези функции. Искаме да обърнем внимание на потребителите, че начинът на работа на такива функции може да бъде променен в бъдещите версии на AutoCAD, затова фирмата "Autodesk-AG" не дава гаранция за съвместимостта на приложенията, които се ползват от тези функции. Приложения с функциите GRTEXT и GRREAD вероятно не работят еднакво на всички хардуерни конфигурации, ако системния програмист не се придържа плътно към следващите правила.
2.7.1 (grclear)
Тази функция изчиства графичния монитор на AutoCAD. При конфигурации с един екран най-напред се превключва от текстов на графичен екран. Областта за команди, както и областта на менюто и статусния ред остават непроменени. Първоначалното съдържание на екрана може да се върне с функцията REDRAW.
2.7.2 (grdraw <от> <до> <цвят> [<маркиране>])
GRDRAW чертае вектор между две точки. <От> и <до> специфицират двете крайни точки (списък от две реални числа) на вектора. Крайните точки се определят като чертожни координати с плаваща запетая и по необходимост се закръгляват за да се вместят на екрана. Векторът се чертае с аргумент <цвят> (цяло число), при което "-1" означава "XOR ink" и допълва всичко, над което чертае и изтрива себе си, ако е чертано там. Ако факултативният целочислен аргумент <маркиране> е даден и не е равен на Nil, векторът се маркира (в общи линии се щрихова). Ако <маркиране> е пропуснат или е равен на Nil се използва нормалния режим на изобразяване.
2.7.3 (grtext <поле> <текст> [<маркиране>])
GRTEXT позволява на AutoLISP да пише в текстовете на графичния монитор на AutoCAD. Ако функцията се извика с номер <поле> между 0 и най-високия номер на поле от екранното меню минус 1, AutoCAD изобразява аргумента <текст> в определеното поле на екранното меню. <Текст> се отрязва, ако не се вмести в полето или съдържа интервали, когато е прекалено къс. Ако е даден целочисления аргумент <маркиране>, който се указва по желание, или не е равен на Nil, текстът в определеното поле се маркира. Ако <маркиране> е равно на 0, текстът се появява в нормалното си състояние. Ако едно поле се маркира, това предизвиква изключване на вече маркирано поле. При писане в поле от меню, текстът трябва да се напише най-напред без аргумент <маркиране> и едва тогава да се маркира. Същият текст, който е написан първоначално в полето, трябва да се използва при прилагане на функцията за маркиране. При неспазване на тези правила може да се окаже, че AutoLISP-програмите работят различно на различни монитори. Тази функция просто изобразява зададения текст в областта на менюто на екрана. Екранното меню не се преписва.
Ако GRTEXT се извиква с номер на поле "-1", текстът ще се изпише в статусния ред за режим на монитора. Дължината на статусния ред е различна за различните монитори. Текстът се вмества в съответното пространство и евентуално се отрязва.
Ако GRTEXT се извиква с номер на поле "-2", текстът се изписва в статусния ред за координати на монитора. Ако е включен режима за изобразяване на координати, координатите в това поле се преместват с всяко преместване на курсора. За номера на полета "-1" и "-2" аргументът <маркиране се игнорира.
GRTEXT може да се извика без аргументи, за да се върнат на всички текстове върху монитора техните стандартни стойности.
2.7.4 (grread [])
С GRREAD могат директно да бъдат четени входните устройства на AutoCAD, като при желание може да се следи всяко движение на указващото устройство. Тази функция се използва само при много специални команди. Повечето въвеждания на AutoLISP стават с GETxxx-функциите (GETSTRING, GETREAL и т.н.). Ако е зададен аргумента и не е равен на Nil, координатите се задават в процеса на движение на указващото устройство, без да се натискат клавиши. AutoCAD използва този механизъм за реализиране видимото водене на буксир на екрана.
GRREAD дава списък, чийто първи елемент е код, който определя типа на въвеждане. Вторият елемент на списъка е или цяло число, или списък от точки, според вида на въвеждане. Кодовете на първия елемент на списъка са:
2 знак от клавиатурата - ASCII-код като втори елемент
3 избрана точка - координати като списък
4 избор на поле на екранно меню - номер на поле като втори елемент
5 координати като втори елемент в режим DRAGMODE. Дава се само, ако е определен втория аргумент и не е равен на Nil
6 избор на меню-функция BUTTON - номер на бутон е втория елемент
7 дигитализиране на меню-функция TABLETT1 - номер на поле е втория елемент
8 дигитализиране на меню-функция TABLETT2 - номер на поле е втория елемент
9 дигитализиране на меню-функция TABLETT3 - номер на поле е втория елемент
10 дигитализиране на меню-функция TABLETT4 - номер на поле е втория елемент
11 дигитализиране на меню-функция AUX - номер на поле е втория елемент
12 задаване на асоциирани координати като втори елемент с бутона на указващото устройство. Винаги следва резултатния списък на тип 6
13 избор на функция от екранното меню, маркиран чрез въвеждане на данни от клавиатурата. Номерът на поле се дава като втори елемент
Въвеждането на CTRL+C по време на изпълнение на GRREAD прекъсва AutoLISP-програмата. Всяко друго на данни се направлява по-нататък от GRREAD, чрез което се осигурява постоянен контрол върху входните устройства.
*AutoLISP*
0>
Сподели с приятели: |