O data merge bine de cateva ori prost Ce lipseste

Creat de costincalin_66, Feb 05, 2013, 07:08 PM

« precedentul - următorul »

costincalin_66

#15
F. interesant. Am salvat exemplul tau intr-un fisier aparte ca sa il am de lectie cand voi mai avea nevoie.
Am gasit si eu o solutie. Am gasit si solutia pt care aratau scarile aiurea. Era Objectsnap ul.
Am periat programul si l-am coafat pana m-am declarat multumit.

Asta este primul meu program LISP!!! :finger:

(defun c:SC (/ p1 p2 p3 h L nr osm h1 L1)
(setvar "CMDECHO" 0)
(command "_.UNDO" "_BEGIN")
(setq h   (getreal  "\nInaltimea scarii  : ")
      L   (getreal  "\nLungimea scarii   : ")
      nr  (getint   "\nNr de trepte      : ")     
      p1  (getpoint "\nPunctul de plecare: ")
      osm (getvar   "OSMODE")
  h1 (/ h nr)
      L1 (/ L (- nr 1)))
(princ              "\nInaltime Treapta  :")
(princ h1)
(princ              "\nAdancime Treapta  :")
(princ L1)
(setvar "OSMODE" 0)
(command "PLINE" p1)
(repeat  nr 
  (setq p2 (list (car p1) (+ (cadr p1) h1)))
  (setq p3 (list (+ (car p1) L1) (+ (cadr p2))))
  (command p2 p3)
  (setq p1 p3)  )
(command "" "_.UNDO" "_END")
(setvar "OSMODE" osm)
(setvar "CMDECHO" 1)
(princ))

Modificat de costincalin_66 (07-02-2013 16:22:25)

costincalin_66

Mai am o problema care nu i-am gasit rezolvare. Poate este complicata.

Presupunem ca desenam un obiect rectangle. Vreau sa-l pot indentifica cumva pentru ca mai tarziu sa-l pot folosi,
pentru o selectie de move, hasura, sau sa aflu diverse propietati gen:
  - nume_obiect_x.area
  - nume_obiect_x.propietate_x.

Este posibil in lisp!

zamfy

#17
Foarte bine ca ai gasit propria implementare a algoritmului. In LISP poti gasi n solutii la aceeasi problema. Totusi, am o observatie: in programul tau nu ar trebui ca L (lungimea scarii) sa fie egala cu L1(adancime treapta)*nr (numarul de trepte)? Daca nu, imi cer scuze pentru intelegerea eronata a programului.
Pentru cea de-a doua problema, uite o rezolvare simpla:
-sa zicem ca desenezi un dreptunghi si vrei sa il folosesti mai tarziu in program:
(command "rectangle" pause pause)
(setq patrat (entlast))
;;aici iti continui programul si dupa un timp vrei sa muti dreptunghiul
;;
(command "move" patrat "" pause pause)
;;etc.
;;acum vrei sa il stergi
(entdel patrat)
;;etc
Si mai jos iti dau 2 functii foarte utile luate dupa net:

elist-> ruleaza cu comanda elist sau ee si iti arata o lista cu toate codurile dxf ale unei entitati
(defun elist ( entity / prin1x princx data xdata )

    (defun prin1x ( x i ) (repeat i (princ "  ")) (prin1 x))
    (defun princx ( x i ) (repeat i (princ "  ")) (princ x))

    (cond
        (   (or
                (and
                    (eq 'ENAME (type entity))
                    (setq data (entget entity))
                )
                (and
                    (listp entity)
                    (setq data entity)
                    (setq entity (cdr (assoc -1 data)))
                )
            )
            (princ "\n\n  (\n")
            (foreach pair data
                (prin1x pair 2)
                (princ "\n")
            )
            (if (setq xdata (assoc -3 (entget entity '("*"))))
                (progn
                    (princx "(" 2)
                    (prin1 (car xdata))
                    (princ "\n")
                    (foreach app (cdr xdata)
                        (princx "(" 3)
                        (princ "\n")
                        (foreach pair app (prin1x pair 4) (princ "\n"))
                        (princx ")" 3)
                        (princ "\n")
                    )
                    (princx ")" 2)
                    (princ "\n")
                )
            )
            (princ "  )")
            (if (= 1 (cdr (assoc 66 data)))
                (while
                    (progn
                        (elist (setq entity (entnext entity)))
                        (not (eq "SEQEND" (cdr (assoc 0 (entget entity)))))
                    )
                )
            )
        )
        (   (print entity)   )
    )
    (princ)
)

(defun c:ee  nil (elist (car (entsel))))
(defun c:eex nil (elist (car (nentsel))))

dump->iti arata proprietatile unei entitati convertite in vla-object
(defun LM:Dump ( object ) (vl-load-com)
  (if
    (setq object
      (cond
        ( (eq 'ENAME (type object))
          (vlax-ename->vla-object object)
        )
        ( (listp object)
          (cdr (assoc -1 object))
        )
        ( (eq 'VLA-OBJECT (type object))
          object
        )
      )
    )
    (progn
      (vlax-dump-object object t)
      (textpage)
    )
  )
  (princ)
)

(defun c:dump  nil (LM:Dump (car (entsel))))

(defun c:dumpn nil (LM:Dump (car (nentsel))))

Sursa celor 2 functii: http://www.lee-mac.com/

Modificat de zamfy (07-02-2013 17:33:34)

costincalin_66

#18
Citat din: zamfy...Totusi, am o observatie: in programul tau nu ar trebui ca L (lungimea scarii) sa fie egala cu L1(adancime treapta)*nr (numarul de trepte)?
...

Din consideratie practica L este lungimea golului de scara in care incap n-1 trepte si a-n-a este pe nivelul de sosire (se numara si sosirea ca treapta), iar trepte avem n * h1=h adica dif de cote dintre nivele.

Cat despre indentificarea unui obiect este simplu.

Programelele de indentificare a propietatilor sunt greoaie. De altfel ma asteptam, neavand decat atom si list ca tipuri de var(lipsind record si object). La nivelul meu de incepator este demoralizant ca in loc de "rectangle.area" sa folosesc o gramada de car si cdr in ciclu.

Multumesc mult!

zamfy

#19
Depinde. De ex., aria unui obiect o poti afla foarte usor astfel:
(command "rectangle" pause pause)
(setq sel (entlast))
(command "area" "o" sel)
(setq ar (getvar "area"))
Fiind incepator, nu intru foarte mult in detalii, dar sa stii ca acel rectangle.area il poti afla exact cum vrei tu folosind functiile vla. Pentru asta, convertesti entitatea intr-un vla-object, apelezi la inceputul programului functia (vl-load-com) si apoi accesezi sau schimbi proprietatile entitatii cu o singura comanda.
De ex. la un dreptunghi ii poti afla proprietatea "area" astfel:
(command "rectangle" pause pause)
(setq sel (entlast))
;;il convertim in vla-object
(setq sel (vlax-ename->vla-object sel))
;;acum ii aflam aria
(setq arie (vlax-get sel 'Area))
Pentru alte proprietati si metode suportate, poti folosi functia dump de mai sus.
Succes!

John Doe

Toate obiectele sunt stocate de AutoCAD sub forma de liste, care nu contin chiar toate proprietatile obiectului respectiv. Una dintre proprietati este chiar suprafata.
Alte obiecte (de exemplu blocurile) contin si subliste, putin mai dificil dar nu imposibil de accesat.
Altele (de exemplu entitatile MTEXT) nu contin coordonatele colturilor zonei de text, ci doar punctul de start, latimea si inaltimea zonei.
Multe ar fi de spus, n-ai cum sa povestesti totul pe un forum.
Daca te ajuta cu ceva, am cartea d-lui Stancescu despre Autolisp (scanata), e mai veche dar foarte buna si e in lb. româna. Spre surprinderea mea, in helpul LISP de la AutoCAD 2007 textele sunt aproape identice cu cele din cartea asta - nu stiu cine de la cine s-a inspirat.

costincalin_66

#21
Citat din: zamfyFiind incepator, nu intru foarte mult in detalii, dar sa stii ca acel rectangle.area il poti afla exact cum vrei tu folosind functiile vla. Pentru asta, convertesti entitatea intr-un vla-object, apelezi la inceputul programului functia (vl-load-com) si apoi accesezi sau schimbi proprietatile entitatii cu o singura comanda.

Ambele variante sunt bune de stiut. Prima pentru chestiuni curente, iar a doua pentru fineturi unde prima varianta nu mai merge. Ai vreun manual de vla sau un link unde le pot gasi si il consideri succint si bun.
Multumesc!

costincalin_66

#22
Citat din: John DoeAlte obiecte (de exemplu blocurile) contin si subliste, putin mai dificil dar nu imposibil de accesat.
Altele (de exemplu entitatile MTEXT) nu contin coordonatele colturilor zonei de text, ci doar punctul de start, latimea si inaltimea zonei.

si un banal rectangle are doar xy de inceput(in properties). Restul unde poate fi gasit? Chiar m-am intrebat!

Citat din: John DoeDaca te ajuta cu ceva, am cartea d-lui Stancescu despre Autolisp (scanata), e mai veche dar foarte buna si e in lb. româna. Spre surprinderea mea, in helpul LISP de la AutoCAD 2007 textele sunt aproape identice cu cele din cartea asta - nu stiu cine de la cine s-a inspirat.

Da, ma intereseaza f. mult. Daca poti, trimite-mi. La inceput nu prea stii cum sa incepi. Un manual este f.bun. Si orice altcveva. Chiar si linkuri la care pot gasi programele de calitate si instructive.
Multumesc!

costincalin_66

n

Modificat de costincalin_66 (25-03-2013 13:40:23)

John Doe

#24
Daca scrii un MTEXT si dai comanda
(entget (car (entsel)))
, ar trebui sa te prinzi la ce identificator din lista ai punctul de start al casetei, si la care ai dimensiunile casetei - le poti masura si tu, le cauti in lista si vezi.
Blocurile sunt ca un grup de elemente; unele proprietati generale ale grupului le vezi in  lista globala a entitatii, iar subentitatile componente sunt prezente doar ca identificator atasat unui cod de grup; se apeleaza mai departe dupa identificatorul asta, ca entitati separate.
O carte despre AutoLISP ai aici: http://dl.transfer.ro/Carte_AutoLISP-transfer_ro-25mar-fc497e.rar . Ai acolo si codurile de entitati asociate.
E scanata cum am putut eu mai demult dar e un manual bun. Pacat ca nu se mai gaseste in librarii. Alte materiale gasesti pe Net câte vrei, nu prea am ce indicatii sa-ti dau. Cauta eventual dupa cuvântul "AFRALISP", au materiale bune si acolo dar in engleza.