CATEGORII DOCUMENTE |
Modificarea unei entitati cu AutoLISP-ul are loc in doua etape.
Modificati lista asociata unei entitati cu functia subst.
Actualizati entitatea prin aplicarea functiei entmod la noua lista asociata.
in acest capitol veti studia:
Cum sa modificati o lista asociata unei entitati.
Cum sa actualizati inregistrarea unei entitati intr-un desen pe baza schimbarilor din lista asociata.
Functia subst inlocuieste un element dintr-o lista. Functia cere trei argumente: valoarea de substituire, valoarea de substituit intr-o lista si o lista care contine valoarea de substituit.
Puteti folosi functia subst pentru a inlocui o valoare intr-o lista asociata unei entitati.
Iata un exemplu care ilustreaza modul cum functioneaza functia subst. Vom inlocui numarul 15 cu numarul 16 in lista noastra de patrate de numere intregi.
Command: (setq mylist (list
4 9 15))
(4 9 15)
Command: !mylist
(4 9 15)
Command: (subst 16 15
mylist)
(4 9 16)
Command: !mylist
(4 9 15)
Deoarece functia subst este non-destructiva, ea nu va afecta legarea variabilei mylist. in acest exemplu functia setq este adaugata expresiei pentru a schimba legarea.
Command: (setq mylist (subst
16 15 mylist))
(4 9 16)
Command: !mylist
(4 9 16)
Introduceti comenzile si expresiile care urmeaza.
intr-un desen nou, desenati o entitate Line de la 1,1 la 5,5.
Command: line
From point: 1,1
To point: 5,5
To point: Enter
Folositi functia subst pentru a schimba punctul de start al listei asociate entitatii Line.
Extrageti sublista pentru punctul de start si pastrati-o sub forma unei variabile.
Command: (setq ename (entnext))
<Entity name: xxxxxxxx>)
Command: (setq elist (entget ename))
( (-1 . <Entity name: xxxxxxxx>) (0 . 'LINE') (8 .
'0') (10 1.0 1.0 0.0) (11 5.0 5.0 0.0) (210 0.0 0.0 1.0))
Command: (setq old_start (assoc 10 elist))
(10 1.0 1.0 0.0)
inlocuiti vechiul punct de start cu unul nou de 7.5,2.5,0 si schimbati legarea variabilei elist.
Command: (setq new_start (list 10 7.5 2.5 0.0))
(10 7.5 2.5 0.0)
Command: (setq elist (subst new_start old_start
elist))
( (-1 . <Entity name: xxxxxxxx>) (0 . 'LINE') (8 .
'0') (10 7.5 2.5 0.0) (11 5.0 5.0 0.0) (210 0.0 0.0 1.0))
Command: (assoc 10 elist)
(10 7.5 2.5 0.0)
Functia entmod modifica proprietatile unei entitati cerind AutoCAD-ului sa actualizeze entitatea pe baza modificarilor facute in lista asociata entitatii.
Functia entmod solicita un singur argument : o lista valabila asociata entitatii.
Folositi functia entmod pentru a aplica modificarile la entitatea Line pe baza modificarilor facute in copia listei asociate.
Introduceti expresiile care urmeaza.
Command: !elist
((-1 . <Entity name: xxxxxxxx>) (0 . 'LINE') (8 .
'0') (10 7.5 2.5 0.0) (11 5.0 5.0 0.0) (210 0.0 0.0 1.0))
Command: (entmod elist)
((-1 . <Entity name: xxxxxxxx>) (0 . 'LINE') (8 .
'0') (10 7.5 2.5 0.0) (11 5.0 5.0 0.0) (210 0.0 0.0 1.0))
Punctul de start al entitatii Line ar trebui sa se deplaseze de la 1.0, 1.0, 0.0 la 7.5, 2.5, 0.0.
Figura 45. Linie inainte si dupa apelarea functiei entmod.
O sublista dintr-o lista asociata poate fi inlocuita cu functia subst.
Functia entmod va actualiza inregistrarea unei entitati in baza de date pe baza modificarilor din lista asociata.
exercitiul 26: actualizarea inregistrarii unei entitati
in acest exercitiu:
Veti aprofunda cunostintele despre modificarea entitatilor si despre listele asociate.
Veti folosi functia entmod.
Veti modifica functia de la exercitiul 26.
Veti modifica listele asociate tuturor entitatilor Line.
Veti actualiza inregistrarea entitatilor acestora.
Deschideti fisierul text scline.lsp.
Salvati textul intr-un fisier nou numit modline.lsp.
Schimbati numele functiei din c:scline in c:modline.
Modificati functia.
Daca entitatea este de tip Line, modificati-i punctul de capat din valoarea curenta in punctul 5.0, 5.0, 0.0.
Salvati fisierul.
intr-un desen nou, desenati citeva linii si cercuri in diferite pozitii.
incarcati fisierul modline.lsp.
Activati comanda MODLINE.
(defun c:scline ()
(setq ename (entnext)) ;get first entity
(setq counter 1) ;initialize counter
(while
ename ;we have an entity?
(if ;if it's a Line
(=
'LINE'
(cdr (assoc 0 (entget ename)))
)
(progn
(command '._SCALE' ename '' '0,0' '0.5');scale it and
(prompt ;tell user which one
(strcat
'anScaling entity '
(itoa counter)
'.an'
)
)
)
)
(setq counter (1+ counter)) ;increment the counter
(setq ename (entnext ename)) ;get the next entity
)
(prin1) ;quiet exit
(defun c:modline ()
(setq ename (entnext)) ;get first entity
(setq counter 1) ;initialize counter
(while
ename ;we have an entity?
(setq elist (entget ename)) ;get its assoc list
(if ;if it's a Line
(= 'LINE' (cdr (assoc 0 elist)))
(progn
(entmod ;change its end point
(subst '(11 5.0 5.0 0.0) (assoc 11 elist) elist)
)
(prompt ;tell user which one
(strcat
'anModifying entity '
(itoa counter)
'.an'
)
)
)
)
(setq counter (1+ counter)) ;increment the counter
(setq ename (entnext ename)) ;get the next entity
)
(prin1) ;quiet exit
exercitiul 27: actualizarea tuturor entitatilor "dimension" intr-un desen
Acesta este un exercitiu optional.
in acest exercitiu:
Veti aprofunda cunostintele despre modificarea entitatilor si listele asociate.
Veti scrie o functie care sa modifice toate entitatile de tip Dimmension din desen.
Deschideti fisierul grafic moddim.dwg in directorul student.
Figure 5. Desenul moddim.dwg.
Dimensiunile din acest desen au fost amplasate pe citeva nivele diferite. Sarcina dvs. este sa scrieti un program AutoLISP care sa caute toate entitatile Dimension din acest desen si sa le amplasati pe nivelul DIM.
Fisierul program AutpLISP moddim.lsp din directorul student contine schita programului. Deschideti acest fisier cu editorul de text si adaugati codul necesar pentru a completa programul.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1725
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved