Lisp per scalare tipo linea

Betoniera

Utente Junior
Professione: Ingegnere
Software: Autodesk Robot
Regione: Lombardia
Quando importo dei disegni dwg succede, a volte, di avere tipo linee con scala non adeguata al mio disegno e differenziate.
Ad esempio succede che alcune linee (tipo punto-linea) siano scalate in modo diverso nello stesso disegno.
L'obiettivo è di riportare TUTTE le line alla scala tipo line = 1 con un programma lisp.
Singolarmente è facile utilizzando le proprietà.
Ma io vorrei una procedura automatizzata per l'intero disegno: riportare tutte le linee alla scala tipo linea = 1
La variabile LTSCALE non va bene perchè scala proporzionalmente tutte le line che mantengono la scalatura singola.
Non sono riuscito a capire su che variabile intervenire per riportare tutte le righe alla scala tipo linea = 1
Avente qualche suggerimento al riguardo?
Grazie, ciao a tutti
 

Tristan

Moderatore Civil 3D
Membro dello Staff
Professione: Application Engineer
Software: Autodesk Civil 3D, Revit e altre amenità
Regione: Trentino
Ma scusa...se sono solo linee, perchè non le selezioni tutte e nella tavolozza delle proprietà imposti il valore di scala tipo linea a 1?
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
LTSCALE è la scala dei tipilinea GENERALE del dwg
La scala tipolinea della singola entità è cosa diversa, e dice che l'entità, partendo dal fattore LTSCALE generale è moltiplicata per il fattore tipo di linea dell'entità.
Questo valore (se diverso da 1) è riportato nel gruppo 48 dell'entità, di tutte le entità (a tal proposito l'help della 2020 è molto carente)
 

Betoniera

Utente Junior
Professione: Ingegnere
Software: Autodesk Robot
Regione: Lombardia
Ringrazio per i contributi
Ciao Tristan
il motivo per cui cerco di implementare quella procedura è che ho realizzato una procedura lisp di "normalizzazione" di file importati da altri.
In questa normalizzazione, cambio le quotature, scale, layer e altre cose per adattarli al mio stile.
Volevo aggiungere la normalizzazione delle linee. tutto qua.

Proverò a fare qualche esperimento col codice di gruppo 48
Ciao
 

Betoniera

Utente Junior
Professione: Ingegnere
Software: Autodesk Robot
Regione: Lombardia
per cristallo
Ho provato ad inserire 2 linee tratto-punto , una con fattore di scala 1 e una con fattore di scale 3
Succede una cosa curiosa: se esamino i dati della linea con fattore di scala 3, trovo il codice di gruppo 48 col fattore 3.
Se, invece, esamino i dati delle linea con fattore di scala 1, il codice di gruppo 48 NON viene scritto, quindi il comando "assoc 48" per estrarre il fattore di scala va in errore.
E' normale?.
Ciao
 

rpor66

Utente Standard
Professione: Programmatore
Software: AutoCad, CadWorx, Lisp, VBA. YouTube: roberto portuese
Regione: Sicilia
"Questo valore (se diverso da 1) è riportato nel gruppo 48 dell'entità"
Prima di modificare, verifica la presenza, se (/= (cdr (assoc 48 entita)) nil) allora procedi al subst.
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
Rpor buongiorno
ieri ho cercato di filtrare un ssget generale vincolandolo al codice gruppo 48, senza esito. Ma credo sia solo che non ci arrivo.
Avresti una dritta?
Io scrivo (ssget "X" '( (48 . "*")) ) ma mi restituisce codice errore...
 

GP.

Utente Senior
Professione: Nientologo
Software: uozapp
Regione: Vercelli
@Cristallo prova con (ssget "x" (list (cons 0 "LINE") '(-4 . "/=") (cons 48 1)))

Comunque, visto lo scopo di Betoniera, porterei tutti i tipolinea = 1 senza filtrare alcun tipo di entità
Codice:
(setq a (ssget "_X" ))
(repeat (setq n (sslength a))
    (setpropertyvalue (ssname a (setq n (1- n))) "LinetypeScale" 1)
)
 

Betoniera

Utente Junior
Professione: Ingegnere
Software: Autodesk Robot
Regione: Lombardia
Ciao a tutti
Stavo implementando il programma
- seleziona punto 1
- selezione punto 2
- seleziona linee con codice 48 diverso da 1 (setq ss1 (ssget "_c" p1 p2 ' ((0 . "LINE") (-4 . "/=") (48 . 1)))
- ciclo per ogni entità per cambiare il codice di gruppo, rigenerazione, ecc.

Arriva GP, scrive 3 righe e funzionano.
Che devo dire?.
Buona Pasqua a tutti e grazie GP.
Ciao, alla prossima.
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
Arriva GP, scrive 3 righe e funzionano.
Che devo dire?.
E che vuoi dire? Sei incappato nella risposta di uno che ha avuto i complimenti da Lee Mac, che ne parliamo a fa?

@GP.
A parte che non immaginavo che potessi costruire una lista filtro in ssget in quel modo (la leggo ed ancora mi si attorcigliano gli occhi), pero' il problema serio è che io non vorrei prendere SOLO le linee, visto che il gruppo 48 è comune a tutte le entità.
Ho cercato di usare le wildcard nella lista di filtraggio (l'help dice che si puo fare) ma mi restituisce sempre errore...
 

GP.

Utente Senior
Professione: Nientologo
Software: uozapp
Regione: Vercelli
...io non vorrei prendere SOLO le linee...
Uso di SSGET per selezionare gli oggetti con scalatipolinea diversa da 1

(setq a (ssget "_X" (list '(0 . "*LINE") '(-4 . "/=") '(48 . 1))))
seleziona LINE, POLYLINE, LWPOLYLINE, SPLINE

(setq a (ssget "_X" (list '(-4 . "/=") '(48 . 1))))
seleziona tutti gli oggetti

(setq a (ssget "_X" (list '(0 . "LINE,ARC,CIRCLE,TEXT,LWPOLYLINE,SPLINE,ELLIPSE") '(-4 . "/=") '(48 . 1))))
seleziona gli oggetti indicati

:)
 

GP.

Utente Senior
Professione: Nientologo
Software: uozapp
Regione: Vercelli
Ne parliamo per imparare :)
La mia conoscenza deriva dal girovagare sui forum dove scrivono i guru del lisp, se vedo qualcosa di interessante prendo appunti.
Rimanendo su SSGET:

(ssget "_+.:S:E:L" '((0 . "LINE")))

spiegazione dei filtri:
Codice:
:S    permette la selezione UNA SOLA VOLTA
+.    inserito prima di :S costringe ssget a rimanere in modalità 'punto', simile a
      quella di PICKAUTO a 0
      in sostanza si seleziona con pickbox e non si apre la finestra di selezione
:E    cattura UN OGGETTO ALLA VOLTA tramite riquadro
      di selezione (pickbox) e non tramite finestra
:L    esclude i layer bloccati
_L    ultimo oggetto "visibile" aggiunto al database
_     "underscore" Lancia il comando in Inglese da versioni localizzate
      è necessario con W  F  WP :S  ma non con X  A  C  CP  I  L  P  :E
_A    ALL (TUTTO) come "X", ma con filtro "congelato"
      Consente di selezionare tutti gli oggetti su layer Scongelati.
_B    BOX - Seleziona tutti gli oggetti all'interno o l'attraversamento di un rettangolo specificato da due punti.
      Se i punti sono specificati da destra a sinistra, Box è equivalente a "Crossing", in caso contrario a "Windows"
:D    Duplicati, altrimenti i duplicati vengono ignorati
:L    Trascura layer bloccati
:P    Trascura Viewport
X     Ricerca avanzata (intero database di ricerca), se non si fornisce un filtro ssget seleziona tutte
      le entità del database, comprese le entità su layer congelati e fuori dello schermo visibile.
      Inoltre, al prompt dei comandi "Selezionare oggetti:" è possibile inserire  Aggiungi, Rimuovi, Annulla
Cattura di tipo misto
(ssget "_X" (list '(8 . "PIPPO") '(0 . "LINE") (cons 62 5)))
(SSGET "X" '((0 . "TEXT,MTEXT,LINE,ARC")(8 . "Linee")))
oggetti rossi e gialli sul layer linee:
(ssget "_X" '((8 . "LINEE") (-4 . "<OR") (62 . 1) (62 . 2) (-4 . "OR>")))

Selezionare oggetti su due layer
prelevando i valori da variabili
(setq lay1 "pippo")
(setq lay2 "pluto")
(setq sel (ssget "_X" (list (cons 8 (strcat lay1 "," lay2)) (cons 0 "CIRCLE"))))
conoscendo i nomi dei layer
(setq a (ssget "_X" (list '(8 . "pippo,pluto") (cons 0 "CIRCLE"))))

Testi che iniziano con A e con B
(ssget "_X" '((0 . "TEXT,MTEXT")(1 . "A*,B*")))

Polilinee con archi
(ssget "_:L" '((0 . "LWPOLYLINE") (-4 . "<>") (42 . 0.0)))

Polilinee SENZA archi
(ssget "_X" '((0 . "LWPOLYLINE")(-4 . "<not")(-4 . "<>")(42 . 0.0)(-4 . "not>")))

Selezionare oggetti su un punto
(ssget pt)

Selezionare gli oggetti che passano attraverso il punto 'pt', con tolleranza (0.001)
(ssget "_C" (mapcar '- pt '(1e-3 1e-3)) (mapcar '+ pt '(1e-3 1e-3)))

Selezionare polilinee chiuse
(ssget '((0 . "*POLYLINE") (-4 . "&") (70 . 1)))

...e mille altre combinazioni ;)
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
:eek: manco il manuale !
E' nei filtri delle liste che è molto carente il manuale. Ti indica che si può fare, ma ti fa un esempio scrauso e chiude li.
Già l'utilizzo del (-4 . ) non è spiegato, sulle condizioni multiple poi è latitante.
E' la prima volta che vedo l'utilizzo della virgola nel gruppo entità (0 . "line,block") o_O
Poi l'utilizzo di (-4 . "<>) : che significa...???
Li hai nidificato un -4 NOT aperto e chiuso (e qui lo capisco) ma il (-4 . "<>") (42 . 0.0) che cos'è???
Ti prego illuminaci.

Ho imparato il lisp sul manuale (cartaceo!!) della versione 12 (non 2012.. la 12 proprio).
Trovo l'help LISP della 2010 riduttivo rispetto a quello della 12, quello della 2020 semplicemente basilare. Una regressione insomma.
 

GP.

Utente Senior
Professione: Nientologo
Software: uozapp
Regione: Vercelli
...ma il (-4 . "<>") (42 . 0.0) che cos'è???
Il dxf 42 è riferito alla curvatura delle LWPOLYLINE, se dai uno sguardo ad un entget vedi che c'è un valore per ogni vertice, se vale 0.0 il segmento è rettilineo (not <> 0.0)
In teoria si potrebbe fare anche al contrario senza not (-4 . "=") (42 . 0.0)

Ne approfitto per salutare smemo SALUTO.gif
 

Betoniera

Utente Junior
Professione: Ingegnere
Software: Autodesk Robot
Regione: Lombardia
Ringrazio tutti per i contributi
Segnalo che facendo dei test col codice di GP e con dwg scritti da altri, a volte viene generato un errore che non ho voluto indagare.
Ho comunque concluso il seguente programma alternativo che metto a disposizione in alternativa a quello di GP.
Ciao a tutti

; trasforma tutte le righe in fattore di scala 1
(setq ss1 (ssget "X" ' ((0 . "LINE"))) ;seleziona tutte le linee
count 0 ;azzera contatore
emax (sslength ss1) ;numero entita
)
(while (< count emax) ;ciclo per ogni entita
(setq en (ssname ss1 count) ;preleva entita
ed (entget en) ;preleva dati entita
el (assoc 48 ed) ;preleva la scala linea codice 48
el1 (cons 48 1) ;definisce la nuova scala (48 . 1)
ed (subst el1 el ed) ;sostituisce la nuova scala
)
(entmod ed) ;rigenera entità
(setq count (1+ count))
);while
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
Betoniera ciao
il tuo codice, a prima vista, dovrebbe darti degli errori, perche quando l'entità ha già scala tipo linea=1 il gruppo 48 non esiste, per cui (setq el) dovrebbe darti nil e quindi il subst andare in errore
 

Betoniera

Utente Junior
Professione: Ingegnere
Software: Autodesk Robot
Regione: Lombardia
Dovrebbe, eppure non lo da.
Per questo motivo non ho filtrato il codice 48.
In caso di dubbio si può aggiungere l'ulteriore filtro.
Ciao