Newsgroup: it.comp.software.cad
Titolo: LISP - Come trovare il nome di un gruppo anonimo?

Ciao a tutti,
come si fa a determinare il nome di un gruppo anonimo (quelli con l'*
davanti) in LISP a cui appartiene un oggetto.
Ringrazio tutti in anticipo.
Ciao
-- 
Emiliano - Webmaster di EmiCAD® - Tutto per AutoCAD e ProgeSOFT® IntelliCAD
e-mail:  
webm...@emicad.it
web:  
www.emicad.it

 ha scritto nel messaggio
news:H0vzc.333088$hc5.14...@news3.tin.it...


 
Ciao.
Visto che c'ero, tanto per provare, ho buttato giù 4 righe :
;questa funzione, data una entità, ritorna l'entità gruppo che
;la contiene 
(defun getGroupEnt ( hel / elemento egruppo ent ret i lista flagOk)
(if hel
  (progn
    (setq lista (entget (car hel)))
    (setq i 0)
    (setq flagOk nil)
    (while (and i (setq elemento (nth i lista)))
      (if flagOk
        (progn
          (if (= (car elemento) 330)
            (progn
              (setq egruppo (cdr elemento))
              (setq i nil)
            );endp
          );endif
        );endp
      );endif
      (cond 
        ((equal elemento '(102 . "{ACAD_REACTORS"))
          (setq flagOk t)
        )
        ((equal elemento '(102 . "}"))
          (setq flagOk nil)
        )
      );endif
      (if i
        (setq i (1+ i))
      )
    );endw      
  );endp
);endif
egruppo
);enddef
;questa funzione, data una entità (di tipo GROUP), ritorna il nome di
;entità del DICTIONARY dei gruppi
(defun getGroupName ( hel / elemento egruppo ent ret i lista flagOk)
(if hel
  (progn
    (setq lista (entget hel))
    (setq i 0)
    (setq flagOk t)
    (while (and i (setq elemento (nth i lista)))
      (if flagOk
        (progn
          (if (= (car elemento) 330)
            (progn
              (setq egruppo (cdr elemento))
              (setq i nil)
            );endp
          );endif
        );endp
      );endif
      (cond 
        ((equal elemento '(102 . "{ACAD_REACTORS"))
          (setq flagOk t)
        )
        ((equal elemento '(102 . "}"))
          (setq flagOk nil)
        )
      );endif
      (if i
        (setq i (1+ i))
      )
    );endw      
  );endp
);endif
egruppo
);enddef
;dato il nome di entità del DICTIONARY dei gruppi
;ritorna la lista dei gruppi con questa forma :
;   ((ent nome) (ent nome) ....)
(defun getListGroups ( ent / elemento ret lista nome h okGroup)
(if ent
  (progn
    (setq okGroup nil)
    (setq lista (entget ent))
    (foreach elemento lista
      (cond 
        ((= (car elemento) 3)
          (setq nome (cdr elemento))
          (setq okGroup t)
        );endc
        ((and okGroup (= (car elemento) 350))
          (setq h (cdr elemento))
          (setq ret (cons (list h nome) ret))
          (setq okGroup nil)
        );endc
      );endcond
    );endfor
  );endp
);endif
ret
);enddef
(defun c:test ( / ent ent2)
(setq ent (getGroupEnt (entsel)))
(if ent
  (progn
    (print "nome gruppo di appartenenza : ")
    (print (assoc ent (getListGroups (getGroupName ent))))
  );Endp
)
(prin1)
)
L'ho provato sommariamente e mi pare funzioni. Questa è la prima cosa che 
mi è venuta in mente. Ovviamente si potrebbe riformulare il tutto 
partendo dal DICTIONARY e non dall'entità. Spero almeno di averti dato 
una spunto.
Ciao.
Roberto Rossi
Web   : 
http://rsoftware.altervista.org


Ti ringrazio, avevo pensato ad una soluzione del genere ma speravo in
qualcosa di più semplice (tipo due righe di codice :-( )
In ogni caso mi hai risolto il problema e mi hai evitato di scrivere tutto
quel codice. Spero che tu lo avessi già pronto e non lo hai scritto
appositamente per me...
Grazie ancora.
