ajutor completare lisp

Creat de chiriladan, Dec 16, 2010, 02:13 AM

« precedentul - următorul »

chiriladan

am nevoie de un mic ajutor la finalizarea unui lisp cu care sa completez (partial) documetatia cadastrala pe baza fisierului cpxml. ideia e in felul urmator: toate cererile, anexele, coperta, le-am pus pe layout-uri separate intr-un fisier template autocad, iar datele care se repeta, cum ar fi : adresa imobil, acte imobil, etc... le-am legat prin field-uri la custom properties. Momentan completez documentatia accesand drawing propertiez prin comanda dwgprops si apoi regenall. Lispul asta v-a introduce din fisierul cpxml (adica generare cp) datele in proprietatile fisierul template autocad.

codul pentru importarea valorilor tagurilor din fisierul cpxml e asta:
       
;;=====================================
(defun read_by_tags  (xml_doc tag / lst)
 (setq adr_elems (vlax-invoke-method
     xml_doc
     'getelementsbytagname
     tag))
 (setq leng (vlax-get-property adr_elems 'length))
 (setq cnt 0)
 (while (< cnt leng)
   (setq tmp (vlax-get-property
 (vlax-get-property
   (vlax-get-property adr_elems 'Item cnt)
   'firstchild)
 'text))
   (setq lst (cons tmp lst))
   (setq cnt (1+ cnt)))
 (cons tag (list (reverse lst)))
 )
;;=====================================
(defun C:demo(/ adr_elems info srt_elems ssp_elems xml_doc)
(vl-load-com)
(setq xml_doc (vla-getinterfaceobject  (vlax-get-acad-object)"msxml.domdocument";))

(while (not (eq :vlax-true(vlax-get-property xml_doc 'async)));wait for application accessibility
 )
(vlax-invoke-method xml_doc 'load "C:/UsedFiles/sample.cpxml";)
(setq info (mapcar  (function (lambda (x)(read_by_tags xml_doc x)))
        (list "ADDRESSID"
       "SIRSUP"
       "SIRUTA";);etc. <-- add all of the desired tags here
     )
     )

(if xml_doc (vlax-release-object xml_doc ))
;; --> work with 'info' here, use 'foreach' or 'mapcar' for that
 (princ)
 )

=========================================
nu cunosc limbajul lisp, codul acesta e de sablon, de pe cadtutor l-am obtinut
http://www.cadtutor.net/forum/showthread.php?54539-how-can-i-import-data-from-xml-file-to-autocad-custom-properties&p=369592#post369592.

din cate imi dau seama trebuie completate tagurile din cpxml si sa se faca legatura dintre "info" si custom properties.

va multumesc!

chiriladan

da...........smiley, e.... o singura paranteza.   :rusine:

John Doe

#2
Iti mai trebuie inca 3 (trei) paranteze la final, altfel functia C:demo nu se incheie. Nu stiu daca si functioneaza - adica la mine nu (syntax error).
Cauta editorul Notepad++, te ajuta foarte mult.

Deschide un fisier CPXML cu Notepad, cred ca alea sunt tagurile. De exemplu:

<?xml version="1.0" standalone="yes"?>
<CPXML>
  <Address>
    <ADDRESSID>1</ADDRESSID>
    <SIRSUP>145140</SIRSUP>
    <SIRUTA>145159</SIRUTA>
    <INTRAVILAN>true</INTRAVILAN>
    <STREETTYPE>STR</STREETTYPE>
    <STREETNAME>-</STREETNAME>
    <POSTALNUMBER>-</POSTALNUMBER>
    <BLOCK />
    <ENTRY />
    <FLOOR />
    <APNO />
    <ZIPCODE />
    <DESCRIPTION />
    <SECTION />
  </Address>
  <Address>
    <ADDRESSID>2</ADDRESSID>
    <SIRSUP>145140</SIRSUP>
    <SIRUTA />
    <INTRAVILAN>false</INTRAVILAN>
    <DISTRICTTYPE />
    <DISTRICTNAME />
    <STREETTYPE />
    <STREETNAME />
    <POSTALNUMBER />
    <BLOCK />
    <FLOOR />

ADDRESSID = numarul adresei; prima e de la beneficiar, a doua de la parcela si grija ca nu scrie explicit numele localitatii ci codurile SIRUES;

Mai departe:
<Deed>
    <DEEDID>1</DEEDID>
    <DEEDNUMBER>1287/43</DEEDNUMBER>
    <DEEDDATE>2001-02-01T00:00:00+02:00</DEEDDATE>
    <DEEDTYPE>ADMINISTRATIVE</DEEDTYPE>
    <AUTHORITY>COMISIA JUDETEANA PENTRU STABILIREA DREPTULUI DE PROPRIETATE ASUPRA TERENURILOR</AUTHORITY>
    <FILEID>1</FILEID>
  </Deed>
  <Deed>
    <DEEDID>2</DEEDID>
    <DEEDNUMBER>656</DEEDNUMBER>
    <DEEDDATE>2001-03-21T00:00:00+02:00</DEEDDATE>
    <DEEDTYPE>ACT_NOTARIAL</DEEDTYPE>
Astea sunt actele; primul e titlul de proprietate, al doilea un contract de vanzare-cumparare... si mai departe te descurci tu... spor !

danco

#3
vezi te rog http://conversiecad.uv.ro sectiunea Generare Anexe CAD

John Doe

Da, acolo poti vedea cum sa comanzi produsul respectiv.. aia e rezolvarea... nu conteaza ce ai intrebat de fapt..

Arhimede

Sunt bune toate programelele astea dar au o mare hiba absolut toate si anume anexele respective nu sunt semnate de proprietar si ca sa rezolvi problema fie mai faci un drum la proprietar fie proprietarul trebuie sa faca un drum la  PF pentru a le semna , eu zic ca este mult mai simplu atunci cind te duci la masurat ai si formularele respective pe care le completezi pe loc si le semneaza proprietarul ,eventual urmand sa fie informat numai de suprafata rezultata din masuratori , in rest eu zic ca-i bine ca sunt persoane preocupate de automatizarea procesului de intocmire a documentatiilor cadastrale ,,SA fiti fericiti de sarbatorile PASCALE" sa auzim de bine.

John Doe

Depinde foarte mult de stilul de lucru al fiecaruia, cred ca e gresit sa afirmi la modul general ca "absolut toate au o hiba". Ca nu se potrivesc la stilul tau da, inteleg, de acord, dar asta e un aspect particular si nu general. Nu cunosc nici un program care sa faca exact ce si cum vrea fiecare user, cred ca adaptarea are si un cale inversa in acest caz.

Cele bune tuturor, de sarbatorile pascale.

zamfy

Pentru ca programul de mai sus sa nu iti mai dea erori de sintaxa si alte minunatii, el trebuie sa arate astfel:

(defun read_by_tags  (xml_doc tag / lst)
  (setq adr_elems (vlax-invoke-method
      xml_doc
      'getelementsbytagname
      tag))
  (setq leng (vlax-get-property adr_elems 'length))
  (setq cnt 0)
  (while (< cnt leng)
    (setq tmp (vlax-get-property
  (vlax-get-property
    (vlax-get-property adr_elems 'Item cnt)
    'firstchild)
  'text))
    (setq lst (cons tmp lst))
    (setq cnt (1+ cnt)))
  (cons tag (list (reverse lst)))
  )
;;=====================================
(defun C:demo(/ adr_elems info srt_elems ssp_elems xml_doc)
(vl-load-com)
(setq xml_doc (vla-getinterfaceobject  (vlax-get-acad-object)"msxml.domdocument"))

(while (not (eq :vlax-true(vlax-get-property xml_doc 'async)));wait for application accessibility
  )
(vlax-invoke-method xml_doc 'load "C:/UsedFiles/sample.cpxml")
(setq info (mapcar  (function (lambda (x)(read_by_tags xml_doc x)))
         (list "ADDRESSID"
        "SIRSUP"
        "SIRUTA";etc. <-- add all of the desired tags here
      )
      )
      )

(if xml_doc (vlax-release-object xml_doc ))
;; --> work with 'info' here, use 'foreach' or 'mapcar' for that
  (princ)
  )

Succes la implementare si poate ne prezinti si noua aplicatia cand va fi gata.

zamfy

Inca ceva, ca sa mearga programul, fisierul trebuie sa aiba extensia .xml, nu .cpxml, altfel nu il vede.

zamfy

#9
Am si eu nevoie de ajutor la acest fisier lisp:
Vreau sa imi extraga punctele din entitati 3D Face si apoi sa imi calculeze volumul intr-un fisier csv, dar imi da o eroare. Acesta este fisierul lisp:
http://www.fileshare.ro/20128024224.4

John Doe

Ar fi niste motive, asa la prima vedere:
1) Nu cred ca exista functia SQR din ceva, mai ales cu argumentul "2" in coada; trebuia sa folosesti SQRT simplu din variabila ta, si vezi tu pe urma ce format iti trebuie si cu cate zecimale;
2) Nu-mi dau seama cine este variabila "s" de la linia 36; trebuia sa fie cumva cifra 2?
3) Cred ca s-a incurcat treaba la extragerea coordonatelor X, Y si Z; mai bine faceai asa:
        CAR (assoc 10 cen) - pentru X
        CADR (assoc 10 cen) - pentru Y
        CADDR (assoc 10 cen) - pentru Z - pe liniile 16-24.
4) Nu-mi dau seama de ce trebuie sa incarci si TopoLT.lsp daca nu pari sa folosessti nici o functie din el - sau mi se pare mie?

Am o carte scanata despre LISP (in limba româna), ai nevoie? S-ar putea sa te ajute. Daca da, zi-mi adresa de mail pe privat. Daca o postezi pe forum nu apare explicit si nu-ti pot atasa fisiere.

zamfy

#11
Multumesc pentru observatii.
1.Functia sqr exista, dar in c++, nu in lisp (asta e, am ramas cu sechele  :).In lisp e functia expt.
2.Variabila s ar fi trebuit sa fie semiper (mea culpa).
3.cadr si car(cdr) ar trebui sa fie acelasi lucru, dar am ascultat sfatul si am pus cadr direct, sa nu ma mai incurc in paranteze
4.Acest lisp face parte dintr-un program mai mare si incarc TopoLT-ul pentru alta functie, nu pentru asta. Am uitat sa o sterg.
5. La linia 23 era o greseala: y3 (car (cdr 12 cen)), corect este y3 (cadr ASSOC 12 cen)
Ar mai fi o problema:
Fisierul excel acum se creeaza corect, dar in loc sa imi treaca z-ul in tabel, imi trece valorile lui y, chiar daca eu i-am dat sa imi puna z-ul. Poate mai e o greseala pe care nu am vazut-o...
Am mare nevoie de acest lisp sa imi functioneze corect, fiindca imi ia prea mult timp sa fac volume prin sectiuni transversale...Stiu ca si TopoLT-ul face volume, dar nu genereaza un astfel de raport.
Acesta este fisierul lisp corectat:
http://www.fileshare.ro/20426186564

Modificat de zamfy (30-05-2011 15:35:45)

John Doe

Ti-am trimis cartea, sincer nu am timp acuma sa ma uit in fisier, dar:
CAR - returneaza prima valoare din lista
CADR - a doua
CADDR - a treia, deci Z-ul

CDR - toata lista in afara de primul element

Ca sa vezi mai exact ce trebuie sa scrii in fisier, scrie in linia de comanda AutoCAD:

(entget (car (entsel)))

, da-i un ENTER si selecteaza entitatea ta 3Dface, ca sa ezi cum arata exact lista cu care lucrezi tu. Cu un F2 pe urma.

advex

#13
Citat din: zamfyAm si eu nevoie de ajutor la acest fisier lisp...


Daca urmezi un curs in India, la centrul de pregatire prezentat in foto, cu siguranta nu vei avea probleme. LISP, LIPS nu mai conteaza...  :)  :)


zamfy

@John Doe, multumesc frumos pentru carte, o sa ma uit pe ea cand o sa am timp...Atentie, aplicatia lisp de mai sus este doar un test si genereaza rezultate partial eronate. Am mai lucrat la ea si in stadiul in care este acum aplicatia, calculeaza volumul si din Polyface mesh, nu doar din 3D Faces, insa mai am de lucru la calculul de volum pentru fiecare entitate.  Mai tarziu ii voi implementa si functia de calcul de volum intre 2 modele 3D, care va fi ceva mai complexa  (si generatoare de bug-uri).
Am facut un test intre rezultatele generate de TopoLT si cele generate de program si la suprafata totala sunt diferente de pana intr-un mp, insa la volumul total diferentele sunt ceva mai mari. O sa testez si in Civil3D sa vad ce rezultate imi da la quantities.
Cand il termin, il postez aici, la test...