Autore |
Discussione |
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 22 novembre 2011 : 17:37:42
|
Messaggio inserito da joseph
Ho fatto la correzione in rosso sul codice allegato precedentemente: dovrebbe funzionare.
funziona !!! perfetto !!! grazie joseph
ho apportato una piccola modifica per poter selezionare manualmente
(defun C:TC ( / acadobj docobj msobj sel-txt sel-cer tts ccs tts-obj ccs-obj len-tt len-cc kk hh pkk cen rad dist) (vl-load-com) (setq sel-glo (ssget)) (command "_select" sel-glo "") (setq sel-txt (ssget "p" '((0 . "TEXT")))) (command "_select" sel-glo "") (setq sel-cer (ssget "p" '((0 . "CIRCLE")))) (setq tts (sel2lst sel-txt)) (setq ccs (sel2lst sel-cer)) (vl-cmdf "_JUSTIFYTEXT" sel-txt "" "MC")
(setq tts-obj (mapcar 'vlax-ename->vla-object tts)) (setq ccs-obj (mapcar 'vlax-ename->vla-object ccs))
(setq len-tt (length tts)) (setq len-cc (length ccs)) (setq kk 0 hh 0) ;inizio ciclo (while (< kk len-tt) (setq pkk (vlax-get (nth kk tts-obj) 'TextAlignmentPoint)) (while (< hh len-cc) (setq cen (vlax-get (nth hh ccs-obj) 'Center ) rad (vlax-get (nth hh ccs-obj) 'Radius)) (setq dist (distance pkk cen)) (if (<= dist rad) (progn (vla-move (nth kk tts-obj) (vlax-3d-point pkk) (vlax-3d-point cen)) (setq hh (1- len-cc)) ) |
Modificato da - arri in data 22 novembre 2011 17:57:54 |
|
|
joseph
Utente Master
Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore
1884 Messaggi |
Inserito il - 22 novembre 2011 : 18:57:51
|
Probabilmente ci metterò ancora le mani anch'io: voglio provare se esiste un modo per sostituire la riga (vl-cmdf "_JUSTIFYTEXT" sel-txt "" "MC") con le funzioni vla-vlax-...; e poi vedere se si può compattare di più. Attento a non perdere per strada la funzione SEL2LST. |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 22 novembre 2011 : 19:08:10
|
Messaggio inserito da joseph
Probabilmente ci metterò ancora le mani anch'io: voglio provare se esiste un modo per sostituire la riga (vl-cmdf "_JUSTIFYTEXT" sel-txt "" "MC") con le funzioni vla-vlax-...; e poi vedere se si può compattare di più. Attento a non perdere per strada la funzione SEL2LST.
ok joseph (comunque è già un gioiello di lisp così)
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 22 novembre 2011 : 21:07:52
|
Il problema potrebbe sussistere se il testo si trova al di là del cerchio... |
|
|
joseph
Utente Master
Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore
1884 Messaggi |
Inserito il - 23 novembre 2011 : 00:45:57
|
| Messaggio inserito da Terminator
Il problema potrebbe sussistere se il testo si trova al di là del cerchio...
|
Sicuramente: anche se il testo ha il punto di allineamento iniziale all'interno del cerchio, se sposto questo punto (p.es da BS a MC) e questo punto esce dal cerchio, il testo non viene spostato. Forse è più corretto: prima spostare i testi e poi applicare la giustificazione, purchè tutti i testi abbiano la stessa giustificazione iniziale; è da verificare su un caso concreto.
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 23 novembre 2011 : 06:36:13
|
| Messaggio inserito da arri
i problemi emergono provando ... occorre prestare attenzione alla selezione perchè se ci sono testi o cerchi indipendenti, i risultati sono imprevedibili.
|
Il problema segnalato da arri nel lisp CENTEXT infatti prevede un'attenta selezione. Dovrei associare ad ogni cerchio un ben determinato testo, senza calcolare la distanza minima e quindi se un cerchio è già "occupato" da un testo, il testo successivo dovrebbe sposarsi al primo cerchio "libero". Fermo restando che si presuma che i testi siano appena collocati fuori dal centro del cerchio relativo e non a 1.000.000 di unità grafiche di distanza. |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 23 novembre 2011 : 08:00:25
|
@ joseph e Terminator
va benissimo così, grazie di nuovo a entrambi |
|
|
joseph
Utente Master
Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore
1884 Messaggi |
Inserito il - 23 novembre 2011 : 10:02:28
|
L'avevo promesso e, anche se non serve più, allego il codice con le modifiche e qualche altra semplificazione che avevo intenzione di apportare.
(defun C:TC ( / acadobj docobj msobj sel-txt sel-cer tts ccs tts-obj ccs-obj len-tt len-cc kk hh pkk cen rad dist) (vl-load-com) (setq sel-txt (ssget "X" '((0 . "TEXT"))) sel-cer (ssget "X" '((0 . "CIRCLE"))) tts-obj (mapcar 'vlax-ename->vla-object (sel2lst sel-txt)) ccs-obj (mapcar 'vlax-ename->vla-object (sel2lst sel-cer)) ) (mapcar '(lambda (x) (vla-put-alignment x acAlignmentMiddleCenter)) tts-obj) (setq len-tt (length tts-obj) len-cc (length ccs-obj) kk 0 hh 0 ) (while (< kk len-tt) (setq txt (nth kk tts-obj) pkk (vlax-get txt 'TextAlignmentPoint)) (while (< hh len-cc) (setq cer (nth hh ccs-obj) cen (vlax-get cer 'Center) rad (vlax-get cer 'Radius) dist (distance pkk cen)) (if (<= dist rad) (progn (vla-move txt (vlax-3d-point pkk) (vlax-3d-point cen)) (setq hh (1- len-cc)) ) ) (setq hh (1+ hh)) ) ;while hh (setq kk (1+ kk) hh 0 ) ) ;while kk ) ;defun
;;;;;; (defun SEL2LST (ss / i lst) (setq i -1) (repeat (sslength ss) (setq lst (cons (ssname ss (setq i (1+ i))) lst)) ) lst ) |
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 23 novembre 2011 : 10:37:49
|
@Joseph Questo è un problema che avevo riscontrato su un lisp fatto a suo tempo e cioé i testi cambiati di giustificazione con la funzione (vla-put-alignment) vengono sbattuti sulla coordinata 0,0. Praticamente si memorizza la coordinata di inserimento iniziale che rimane la stessa per ogni giustificazione del testo. Dopo lo spostamento su 0,0 memorizzo la nuova coordinata di inserimento. Alla fine un normale vla-move fra le due coordinate.
(defun C:TC (/ acadobj docobj msobj sel-txt sel-cer tts ccs tts-obj ccs-obj len-tt len-cc kk hh pkk
cen rad dist)
(vl-load-com)
(setq sel-txt (ssget "X" '((0 . "TEXT")))
sel-cer (ssget "X" '((0 . "CIRCLE")))
tts-obj (mapcar 'vlax-ename->vla-object (sel2lst sel-txt))
ccs-obj (mapcar 'vlax-ename->vla-object (sel2lst sel-cer))
)
(mapcar '(lambda (x)
(setq punto(vla-get-insertionpoint x))
(vla-put-alignment x acAlignmentMiddleCenter)
(setq punto0(vla-get-insertionpoint x))
(vla-move x punto0 punto)
)
tts-obj
)
(setq len-tt (length tts-obj)
len-cc (length ccs-obj)
kk 0
hh 0
)
(while (< kk len-tt)
(setq txt (nth kk tts-obj)
pkk (vlax-get txt 'TextAlignmentPoint)
)
(while (< hh len-cc)
(setq cer (nth hh ccs-obj)
cen (vlax-get cer 'Center)
rad (vlax-get cer 'Radius)
dist (distance pkk cen)
)
(if (<= dist rad)
(progn
(vla-move txt (vlax-3d-point pkk) (vlax-3d-point cen))
(setq hh (1- len-cc))
)
)
(setq hh (1+ hh))
) ;while hh
(setq kk (1+ kk)
hh 0
)
) ;while kk
) ;defun
;;;;;;
(defun SEL2LST (ss / i lst)
(setq i -1)
(repeat (sslength ss)
(setq lst (cons (ssname ss (setq i (1+ i))) lst))
)
lst
) |
|
|
joseph
Utente Master
Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore
1884 Messaggi |
Inserito il - 23 novembre 2011 : 11:29:09
|
Il fatto di sbattere le stringhe di testo sul punto (0,0) mi ha fatto perdere ieri una buona mezzora perchè, facendo alcune prove su una vista molto ravvicinata che non comprendeva l'origine, sembrava che i testi, dopo la modifica, venissero magicamente cancellati, finchè non ho fatto uno zoom estensione e me li sono trovati tutti spostati in (0,0). In effetti nel mio codice non prevedo che i testi siano manipolati in precedenza.
PS. Allego una variante della funzione Sel2Lst, trovata in rete, che viene dichiarata più veloce della precedente:
(defun SEL2LST (ss / i ent lst) (setq i -1) (while (setq ent (ssname ss (setq i (1+ i)))) (setq lst (cons (vlax-ename->vla-object ent) lst))) Lst )
|
Modificato da - joseph in data 23 novembre 2011 12:03:01 |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 23 novembre 2011 : 12:31:13
|
Messaggio inserito da joseph
Il fatto di sbattere le stringhe di testo sul punto (0,0) mi ha fatto perdere ieri una buona mezzora perchè, facendo alcune prove su una vista molto ravvicinata che non comprendeva l'origine, sembrava che i testi, dopo la modifica, venissero magicamente cancellati, finchè non ho fatto uno zoom estensione e me li sono trovati tutti spostati in (0,0). In effetti nel mio codice non prevedo che i testi siano manipolati in precedenza.
PS. Allego una variante della funzione Sel2Lst, trovata in rete, che viene dichiarata più veloce della precedente:
(defun SEL2LST (ss / i ent lst) (setq i -1) (while (setq ent (ssname ss (setq i (1+ i)))) (setq lst (cons (vlax-ename->vla-object ent) lst))) Lst )
grazie joseph ... sempre alla ricerca della perfezione
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 23 novembre 2011 : 12:54:00
|
La prima mi crea un insieme di selezione di entità normali, la seconda entità vla-object, quindi valide tutte e due. |
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 27 novembre 2011 : 08:42:16
|
Giusto per sfizio, sono riuscito ad ottenere quello che volevo e cioè l'inserimento del testo nel primo cerchio "libero". Il programma controlla che la selezione sia divisibile per 2 e che la selezione cerchi sia uguale alla selezione dei testi. Quindi funziona anche alle famose 1.000.000 unità grafiche di distanza.
;;; **************************************CENTEXT**********************************************
;;; Funzione per CENTRARE I TESTI NEI PALLINI
;;;
;;; 22/11/2011 - EMISSIONE
;;; 27/11/2011 - MIGLIORATA GESTIONE SELEZIONE CERCHI-TESTI
(defun C:CENTEXT (/ gru grucerchi grutesti index gruc grut listadist listacer)
(setq gru (ssget '(
(-4 . "<OR")
(0 . "TEXT")
(0 . "CIRCLE")
(-4 . "OR>")
)
)
grucerchi (ssadd)
grutesti (ssadd)
index 0
)
(repeat (sslength gru)
(cond
((= (cdr (assoc 0 (entget (ssname gru index)))) "CIRCLE")
(ssadd (ssname gru index) grucerchi)
)
((= (cdr (assoc 0 (entget (ssname gru index)))) "TEXT")
(ssadd (ssname gru index) grutesti)
)
)
(setq index (1+ index))
)
(if (and (= (rem (sslength gru) 2) 0)
(= (sslength grucerchi) (sslength grutesti))
)
(progn
(vl-cmdf "_JUSTIFYTEXT" grutesti "" "M")
(setq gruc (mapcar '(lambda (elem) (list elem (cdr (assoc 10 (entget elem)))))
(ssgetli grucerchi)
)
grut (mapcar '(lambda (elem) (list elem (cdr (assoc 11 (entget elem))) nil))
(ssgetli grutesti)
)
)
(foreach elem gruc
(setq grut
(vl-sort
grut
'(lambda (x y) (< (distance (cadr elem) (cadr x)) (distance (cadr elem) (cadr y))))
)
)
(setq index 0
segno "x"
)
(while segno
(if (= (caddr (nth index grut)) nil)
(progn
(vl-cmdf "_MOVE" (car (nth index grut)) "" (cadr (nth index grut)) (cadr elem))
(setq grut (subst
(list (car (nth index grut)) (cadr elem) "x")
(nth index grut)
grut
)
segno nil
)
)
)
(setq index (1+ index))
)
)
)
)
(princ)
)
;; ****************************FUNZIONE SSGETLI*************************************
;;; Funzione che trasforma una lista ssget in una lista normale
(defun ssgetli (selezione / gruppo)
(if (and selezione
(equal (type selezione) 'PICKSET)
)
(progn
(setq gruppo (vl-remove-if
'(lambda (elemento) (equal (type elemento) 'LIST))
(mapcar 'cadr (ssnamex selezione))
)
)
)
)
)
(princ
"\nCENTEXT (vers.2) - by Terminator"
)
(princ "\nDigitare CENTEXT per lanciare il lisp")
(princ) |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 29 novembre 2011 : 11:23:33
|
Messaggio inserito da Terminator
Giusto per sfizio, sono riuscito ad ottenere quello che volevo e cioè l'inserimento del testo nel primo cerchio "libero".
ma in questo caso i testo viene inserito in un cerchio a caso ...
non perdere ulteriore tempo, va bene il lisp di joseph |
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 29 novembre 2011 : 21:17:07
|
Ho solo cercato di considerare il testo non proprio rigidamente vicino al cerchio, ma anche un po' più lontano. Più "elastico", insomma. |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 30 novembre 2011 : 08:05:02
|
Messaggio inserito da Terminator
Ho solo cercato di considerare il testo non proprio rigidamente vicino al cerchio, ma anche un po' più lontano. Più "elastico", insomma.
il fatto è che si composta in modo strano, ad esempio (prendendo come esempio il dwg allegato) se sposti due testi fuori dai cerchi, centra solo questi ultimi e non tutti gli altri
|
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 30 novembre 2011 : 08:53:36
|
Mi sono accorto in ritardo che il dwg era allegato qualche post prima, ma il lisp non mi dà nessun comportamento strano. Per quanto riguarda l'altro lisp vedrò di rimetterci mano quando posso, anche se non ho ben capito il tipo di problema e se le sincronizzazioni ci devono essere o meno, scusa... |
Modificato da - Terminator in data 30 novembre 2011 08:54:41 |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 30 novembre 2011 : 09:07:19
|
Messaggio inserito da Terminator non ho ben capito il tipo di problema e se le sincronizzazioni ci devono essere o meno
se il dwg ha gli attributi già sincronizzati, il lisp è perfetto perchè sinronizzando di nuovo toglie gli attributi invisibili ma non modifica nulla per quanto riguarda tutto il resto.
Invece se il dwg presenta attributi NON sicronizzati, il lisp oltre a eliminare gli attributi invisibili, modifica anche il resto (ad esempio larhezza, altezza, inclinazione ecc.) con risultati disastrosi.
|
|
|
Discussione |
|