Instalarea aplicatiilor proprii e cel mai bine să fie făcut-ă într-un director separat (de exemplu C:\ LSP). În acest fel aplicatiile nu se pierd la o eventuală reinstalare a AutoCAD-ului (dacă le-am pune într-un subdirector al AutoCAD-ului), nu sunt probleme dacă rulăm mai multe versiuni de AutoCAD, iar solutia cu crearea unui director în “My Documents” îi dezavantajează pe utilizatorii de versiuni de AutoCAD ce nu admit nume lungi (adică toate versiunile în afară de R13c4 si R14).
Cam astea sunt argumentele. Să vedem cum facem ca o aplicatie proprie să poată fi rulată.
Aplicatiile care sunt necesare în toate sesiunile de lucru (deci nu sunt specializate pe un domeniu) se pot încărca automat prin fisierul acad.lsp, existent în directorul Support al AutoCAD-ului, punând o linie de comandă de forma:
(load: "nume_fisier_aplicatie")
unde nume_fisier_aplicatie este numele fisierului LISP ce contine aplicatia (aplicatia din interior poate avea acelasi nume, cum e corect, dar poate să si difere de numele fisierului).
O altă solutie (recomandată însă celor ce au ceva experientă în lucrul cu fisiere lisp si cu fisiere de meniu – mnu), pentru aplicatiile proprii este apelarea lor dintr-un meniu. În acest caz, dacă aplicatia este generală, valabilă în toate sesiunile de lucru, ea (fisierul LSP) se adaugă în fisierul acad.mnl ce contine toate aplicatiile ce sunt apelate din meniu. Inserarea se poate face oriunde intre două lisp-uri (atentie la paranteze, să nu deranjati altă comandă!), respectând conditiile de sintaxă a programelor AutoLISP. De exemplu, iată sfârsitul fisierului acadful.mnl al AutoCAD-ului 13:
(setvar "FILEDIA" filedia)
(setvar "CMDECHO" cmdecho)
)
(aici punem aplicatia noastră, între 2 paranteze rotunde)
); aici se termina toate aplicatiile din meniu
(princ ;|ACAD_MNL_25|;"loaded.")
(princ)
În felul acesta, aplicatia proprie se va încărca odată cu pornirea AutoCAD-ului, cu avantajul că o putem apela imediat, dar cu dezavantajul că toate aplicatiile le avem încărcate în memorie. În cazul în care aplicatia e folosită accidental, se recomandă încărcarea ei doar la apelarea comenzi din meniu, punând în fata comenzii respective, în fisierul acad.mnu, secventa
(load: "nume_fisier_aplicatie").
Pentru cei mai meticulosi, se poate face întâi un control dacă aplicatia a mai fost apelată (deci este deja încărcată), cu o secventă de forma:
(if (= (member ‘nume_aplicatie ‘(atoms-family 0)) nil)(load "nume_fisier_aplicatie")
Exemplu:
(if (= member ‘getlay ‘(atoms-family 0)) nil)(load "getlay"))
caz în care getlay este si numele fisierului (getlay.lsp), dar si numele functiei: (defun c:getlay()…
Un program simplu, dar foarte util programatorilor de AutoLISP, care au nevoie să revină de foarte multe ori la acelasi fisier spre a-l edita. Programul deschide o fereastră de dialog de unde se poate alege fisierul de editat. La următoarea apelare, numele fisierului anterior editat este propus implicit, deci alegerea este mult mai rapidă.
Încărcarea programului se poate face direct din acad.lsp cu comanda (load “de”). În timpul lucrului, apelarea programului se face dând comanda edi pe prompterul “Command:”. Editarea se face cu programul “Edit” (din Dos), iar pentru cei ce lucrează doar în AutoCAD-ul sub Windows, se poate înlocui editorul cu Notepad.exe astfel:
în fisierul acad.pgp, se înlocuieste linia
EDIT,edit, 0,File to edit: ,4
cu linia:
EDIT,notepad, 0,File to edit: ,4
Programul permite extragerea din desen, într-un fisier ASCII, a unor puncte caracteristice. Extragerea se face într-un fisier cu extensia .NOU, numele putând fi dat de operator (implicit programul propune acelasi nume cu numele desenului DWG). Indicarea punctului se poate face folosind filtrele Osnap (implicit programul setează Osnap pe END). Pentru detaliere, este posibilă folosirea Zoom-ului transparent (‘Zoom).
Punctele pot fi extrase si cu coordonatele inversate (util în topografie). Implicit ordinea este Y,X.
Odată punctul indicat, se cere o etichetă (alfanumerică) pentru identificarea acestuia.
Programul permite modificarea globală a înăltimii entitătilor de tip text selectate din desen. De retinut că textul îsi păstrează punctul de inserare. Programul este foarte util când dorim ca, un desen deja realizat pentru o anumită scara, să fie plotat la altă scară. Nu functionează pentru entităti mtext (decât dacă acestea sunt explodate în text).
Programul permite aflarea coordonatelor vertexurilor unei polilinii si scrierea lor într-un fisier ASCII cu un nume dat de utilizator si extensia .DAT (scrisa automat de program) de felul următor:
1,81.73,152.83
2,220.84,152.83
3,220.84,283.73
4,260.48,283.73
5,260.48,380.52
6,138.76,380.52
7,138.76,248.22
8,80.34,248.22
Fisierul este scris în directorul de pornire (Start în:) al AutoCAD-ului.
Programul este foarte util în lucrări de topografie, când se construieste grafic o incintă, după care este necesară aflarea coordonatelor. Programul cere ordinea coordonatelor X,Y sau Y,X si în functie de optiune, forma datelor în fisierul de iesire va fi:
licenta,coordonataX,coordonataY (pentru X,Y),
respectiv
licenta,coordonataY,coordonataX (pentru optiunea Y,X).
Nu multă lume stie că putem înregistra istoricul unei sesiuni de lucru într-un fisier ASCII. Acest fisier se numeste acad.log si poate fi de o utilitate deosebită în reluarea unei constructii, dar mai ales la întocmirea unei documentatii tehnice. Pentru ca AutoCAD-ul să creeze acest fisier, trebuie să facem această setare în meniul Options -> Preferences… -> Environment -> Support, cum se vede în figura următoare:
De retinut că fiecare sesiune de lucru face append la fisier, motiv pentru care, periodic trebuie sters pentru a nu ocupa spatiul pe disc (cât de des, este în functie de volumul de lucru, dar o dată pe lună dati un ochi pe la el să vedeti cum a mai crescut).
Programul permite inserarea în desen a unor blocuri si scalarea lor convenabilă. Elementul de noutate este că, în functie de o serie de parametrii de intrare (num:layer si num:block), blocul se inserează pe un anumit layer, astfel putând avea fiecare grupă de elemente (sanitare, electrice, et.) grupate din capul locului pe layer-e. Programul verifică dacă layer-ul există si dacă e înghetat si actionează în consecintă. Aceasta mică unealtă a fost construită mai ales pentru inserarea de simboluri în desen, motiv pentru care scara implicită este 1:1, dar se poate adapta corespunzător pentru orice fel de blocuri.
Pentru a functiona din meniu, în fisierul acadful.mns (sau acad.mns) – Atentie, nu în fisierul mnu, că pierdeti toate customizările proprii (butoane) – se introduc, în sectiunile corespunzătoare, comenzile:
***POP11
[Sanitare]$i=icon_sanitare $i=*
[—]
.
.
.
***ICON (respectiv ***IMAGE pentru Acad13)
**icon_sanitare
[Scheme conventionale - obiecte sanitare]
[sanitare(Chiuveta,Chiuveta - vedere)](setlayer "sanitare" "chiuveta")
Revedeti modul de creare a bibliotecilor de simboluri din CAD report An2Nr1 (pag.46). Apelarea se face din meniul desfăsurabil, numit “Custom”:
Programul permite schimbarea layer-ului curent. Schimbarea se face prin selectarea unui obiect continut în layer-ul ce dorim să devină curent. Dacă există un obiect deja selectat, acea selectie este considerată validă si se schimbă layer-ul. Dacă la actionarea comenzii sunt deja selectate mai multe obiecte aflate în layer-e diferite, setul de selectie se anulează si programul cere selectarea unui obiect (nu este permisă decât selectia pick). Programul este implementat în versiunea 14 a AutoCAD-ului.
Cel mai comod (si mai elegant) este să atasăm comanda unui buton, astfel:
Închidem toate ferestrele, iar comanda este acum functională.
Succes.
Răspunsul la scrisoarea cititorului nostru, Lucian CRISAN
Sunt deosebit de onorat de faptul că vă pot fi de folos pentru rezolvarea problemei Dvs. (una dintre ele, căci am înteles că sunt mai multe). Pentru că revista CAD Report ne-a pus la dispozitie acest spatiu pentru prezentarea propunerii mele de rezolvare a problemei în cauză vă rog să îmi permiteti mai întâi să prezint si cititorilor nostri care este problema ridicată de Dvs.
Se doreste stergerea unui vertex dintr-o polilinie printr-un program AutoLISP, fără utilizarea comenzii PEDIT care generează erori în momentul în care pe ecran nu este afisată toată polilinia.
Utilizatorii (de AutoCAD) stiu că la efectuarea unui ZOOM comanda PEDIT preia din entitatea polyline numai vertex-urile care sunt vizibile. Astfel dacă se utilizează într-un program AutoLISP această comandă utilizatorul nu mai poate gestiona vertex-urile asupra cărora se va aplica una din optiunile comenzii PEDIT (de exemplu STRAIGHTEN).
Pentru a remedia acest neajuns (faptul că multe comenzi AutoCAD sunt dependente de ZOOM este de notorietate) propun un program (relativ simplu) care poate realiza eliminarea unui vertex fără a utiliza comanda PEDIT.
Cred că ar fi interesant ca într-unul din numerele viitoare al revistei să prezentăm cititorilor si programul Dvs. (si eu as fi curios să văd cum ati rezolvat probleme legate de preluarea si verificarea punctelor, chiar dacă nu e ea mau bună rezolvare).
Programul care este prezentat alăturat contine o functie pentru preluarea vertex-urilor unei polilinii si o functie comandă care realizează de fapt eliminarea vertex-ului dorit.
Pentru ca cititorii să poată întelege mai bine cum stau lucrurile voi face scurte comentarii la cele mai importante instructiuni ale programului.
Functia getva are ca argument de intrare un entity_name care poate fi preluat cu functia entsel (vezi primele linii ale functiei c:pedt). Plecând de la această entitate (care se presupune că este tip POLYLINE) se preia din următoarea subentitate (care este de tip VERTEX) punctul din lista asociată (cod 10) si asa mai departe până la preluarea tuturor punctelor vertex-urilor. La fiecare vertex mai este preluată si valoarea pentru asa numitul bulge factor (factor de umflare) care guvernează segmentele de tip arc de cerc dintr-o polilinie. Cu aceste două elemente (punctul corespunzător unui vertex si factorul de umflare) se realizează o listă (VerLst) care este returnată.
Functia comandă PEDT lucrează în modul următor:
Operatia de eliminare este realizată indiferent de ZOOM-ul curent.
Să parcurgem pe scurt functia PEDT si să venim cu precizări (cred eu folositoare).
Selectia poliliniei asupra căreia se va lucra se face cu ajutorul functiei entsel. Se cunoaste că această functie returnează o listă formată din numele entitătii (entity_name) si punctul în care ea a fost selectată (Hmmm… poate acesta ar fi un punct de plecare pentru un program care să realizeze inserarea unui vertex). Din această listă se preia cu functia car doar numele entitătii. Acesta este pasat ca argument functiei getva care returnează în variabila L:VER lista cu vertex-uri. Următoarea operatie este preluarea vertex-ului care trebuie eliminat. Aceasta se face foarte usor cu ajutorul functiei getpoint. Urmează stergerea “vechii” polilinii. De remarcat că această operatie se face prin intermediul functiei entdel si nu cu ajutorul comenzii ERASE aceasta pentru că programul poate fi îmbunătătit prin prevederea unei posibilităti de undo care se poate realiza usor fără a utiliza comanda UNDO ci prin utilizarea aceleiasi functii entdel căreia i se “pasează” ca argument numele entitătii sterse anterior.
Apoi se initializează un contor de ciclu necesar pentru a parcurge lista L:VER. Tot aici se initiază si realizarea unei entităti prin utilizarea functiei entmake. Această functie este utilizată pentru realizarea entitătilor fără a utiliza comenzi specifice AutoCAD. Pentru polilinia nouă se specifică doar layer-ul (care este fixat la “0” dar care poate fi preluat de la vechea polilinie) si faptul că urmează vertex-uri (cod 66).
În bucla while care parcurge întreaga listă de vertex-uri se testează mai întâi cu o instructiune if dacă punctul din lista L:VER nu este cumva chiar cel care trebuie eliminat si dacă este acesta îl “sare”. Pentru fiecare din celelalte puncte se realizează o entitate de tip VERTEX tot cu ajutorul functiei entmake.
După încheierea buclei while se realizează “definitivarea” poliliniei (mai precis se transmite codul prin care interpretorului AutoLISP îi este semnalată terminarea secventei de definire a vertex-urilor (realizarea unei “entităti” de tipul seqend). În final pentru a fi ceva “professional” este utilizată functia princ pentru ca la prompterul “Command:“ să nu fie returnat nimic.
Nae BITOAICĂ, CAD Integrator Ltd, tel/fax: 01-781.51.92; e-mail: cadigr@starnets.roContactPentru sugestii si reclamatii privind paginile Tips&Triks din sec'iunea de practică scrieti-ne pe adresa redactiei sau prin e-mail la cadrep@agora.ro |
Noi TTDacă aveti noi probleme si rezolvări, sau alte rezolvări pentru problemele publicate, nu ezitati să ni le trimiteti pe adresa redactiei sau prin e-mail la cadreport@agora.ro. |
Sursa surselorCea mai simplă cale de a vă procura sursele publicate în acest număr este via http://www.agora.ro/cdrep/ |