Sostituire ennesimo elemento di una lista

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
#1
Avrei bisogno di aiuto per trovare un metodo veloce per sostituire l'ennesimo elemento di una lista:
data una lista con tutti 0...
'(0 0 0 0)
vorrei incrementare i vari elementi singolarmente.... ad es.
(0 0 1 0) successiv. (0 1 1 0) poi (0 2 1 0) ecc
fino ad arrivare ad una cosa tipo (152 18 362 1258)....
Ovvianente non posso farlo usando SUBST poiché mi sostituirebbe tutti gli 0 ...
C'é un comando (magari un vl-xxx) che me lo faccia velocemente, dato che questa lista fungerà da "contatore" ed incrementarsi nei suoi vari elementi, per conteggiare centinaia di entità. Grazie.
 

rpor66

Utente Standard
Professione: Programmatore
Software: AutoCad, GstarCAD, CadWorx, Excel, Lisp, VBA
Regione: Sicilia
#2
(setq lista (vlax-make-safearray vlax-vbLong '(0 . 3)))
; crea lista (0 0 0 0)

; modifica lista in base a indice (da 0 a 3) sommando valore
(defun Contatore(lista indice valore)
(vlax-safearray-put-element lista indice (+ valore (vlax-safearray-get-element lista indice)))
)

; esempio: (Contatore lista 3 10) -> (0 0 0 10)
 

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
#4
Ho provato ad utiluzzare i comandi che mi hai consigliato... ma non riesco a farli funzionare!
setq lista (vlax-make-safearray vlax-vbLong '(0 . 3)))
; non mi crea lista (0 0 0 0).... ma da errore: #safearray...
Mi sono detto: uso il mio vecchio metodo basato su (Append '(0) numelem))

ma poi anche
(vlax-safearray-put-element lista indice (+ valore (vlax-safearray-get-element lista indice)))
mi va in errore...

ovviamente ho anche messo ad inizio listato (vl-load-com)
 

rpor66

Utente Standard
Professione: Programmatore
Software: AutoCad, GstarCAD, CadWorx, Excel, Lisp, VBA
Regione: Sicilia
#5
Codice:
; crea vettore (0 0 0 0)
(setq lista (vlax-make-safearray vlax-vbLong '(0 . 3)))

; da vettore a lista - solo per vedere i dati
(vlax-safearray->list lista)
    
; modifica lista in base a indice (da 0 a 3) sommando valore
(defun Contatore(lista indice valore / v)
    (vlax-safearray-put-element lista indice (+ valore (vlax-safearray-get-element lista indice)))
)
Creati un file lisp e incollaci il codice.
Caricalo.

A questo punto digiti su command:
(Contatore lista 3 10)
(vlax-safearray->list lista) ti mostrerà (0 0 0 10)
 

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
#6
Ho fatto quanto mi hai detto .... e funziona.
Ora cercero' di inserirlo nel mio lisp.... e poi condividero' quest'ultimo con tutti voi!

Grazie per la disponibilità!
 

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
#7
Come promesso ecco il risultato delle mie "Fatiche" (con il prezioso aiuto di RPOR66!)

Il comando CONTALUNG serve per contare le linee selezionate che hanno lunghezze MINORI o UGUALI ad un elenco: se l'elenco fosse 10, 50, 200, 1000; verrebbero conteggiate (ed inserite in una tabella) tutte le linee più corte di 10, quelle fra 10 e 20 ... fino a quelle più lunghe di 1000.
L'elenco può essere una stringa composta da numeri separati da virgole (per i decimali ovviamente si usa il punto), oppure si possono selezionare dei testi o dei testi multilinea.
Questi ultimi vengono "spezzati" per ottenere i dati.

Questo comando è stato creato su Autocad ... ma gira senza problemi su GStarCAD.
 

Allegati