Autore |
Discussione |
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 21 novembre 2011 : 09:37:22
|
molte volte capitano dei dwg con pallinatura (formati da cerchio + testo) dove i testi all'interno di un cerchio non sono centrati.
Sarebbe utile un lisp che permetta di spostare il punto di inserimento del testo al centro del cerchio.
Da una selezione il lisp dovrebbe: - Filtrare solo cerchi e testi
- controllare se il testo è all'interno del cerchio
- se il testo è all'interno, spostare il punto sd'inserimento del testo al centro del cerchio
|
|
joseph
Utente Master
Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore
1884 Messaggi |
Inserito il - 21 novembre 2011 : 11:08:09
|
| Messaggio di arri
molte volte capitano dei dwg con pallinatura (formati da cerchio + testo) dove i testi all'interno di un cerchio non sono centrati.
Sarebbe utile un lisp che permetta di spostare il punto di inserimento del testo al centro del cerchio.
Da una selezione il lisp dovrebbe: - Filtrare solo cerchi e testi
- controllare se il testo è all'interno del cerchio
- se il testo è all'interno, spostare il punto sd'inserimento del testo al centro del cerchio
|
Meglio ancora, nell'ultima fase, prima cambiare la giustificazione del testo a MezzoCentro (MC)(oppure Mezzo se il testo contiene caratteri minuscoli discendenti) e poi spostare il testo al centro del cerchio.
|
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 21 novembre 2011 : 11:20:19
|
Messaggio inserito da joseph
Meglio ancora, nell'ultima fase, prima cambiare la giustificazione del testo a MezzoCentro (MC)(oppure Mezzo se il testo contiene caratteri minuscoli discendenti) e poi spostare il testo al centro del cerchio.
l'importante è il lisp, poi per la giustificazione avrei usato (prima) _justifytext |
Modificato da - arri in data 21 novembre 2011 11:36:38 |
|
|
Aniello Annunziata
Amministratore
Regione: Campania
Prov.: Napoli
Città: San Giuseppe Vesuviano
2302 Messaggi |
Inserito il - 21 novembre 2011 : 12:33:23
|
La parte difficile è la verifica. Selezionare solo cerchi e testi (riga singola) è semplice basta usare select ed i filtri. Come è abbastanza semplice cambiare l'attributo del punto d'inserimento testo (MC secondo me è quello giusto) Il problema è controllare che il testo sia interno al cerchio. Se qualcuno ha idea, io faccio il Lisp in mezz'ora. |
Aniello Annunziata Staff di CADLandia www.cadlandia.com aniello.annunziata@cadlandia.com |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 21 novembre 2011 : 12:35:23
|
Messaggio inserito da Aniello Annunziata
La parte difficile è la verifica.
precisamente !
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 21 novembre 2011 : 12:57:01
|
Facendo una selezione dei cerchi e dei testi, io dovrei considerare il testo più vicino ad un ben determinato cerchio, a prescindere se è interno o meno e di seguito gli altri. |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 21 novembre 2011 : 13:00:46
|
Messaggio inserito da Terminator
Facendo una selezione dei cerchi e dei testi, io dovrei considerare il testo più vicino ad un ben determinato cerchio, a prescindere se è interno o meno e di seguito gli altri.
va benissimo anche così Terminator
|
|
|
GP
Utente Master
Regione: Piemonte
Prov.: Vercelli
2776 Messaggi |
Inserito il - 21 novembre 2011 : 13:51:31
|
Per verificare se un punto è "interno" basta calcolare quante volte l'ipotetica linea dal quel punto ad un punto "distante" interseca il contorno.
0 = esterno PARI = esterno DISPARI = interno |
|
|
joseph
Utente Master
Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore
1884 Messaggi |
Inserito il - 21 novembre 2011 : 14:00:57
|
Traccia di un eventuale codice:
- Creare una selezione testi+cerchi - Trasformare la selezione in 2 liste (testi e cerchi) - foreach kk testi -cambiare la giustificazione di kk -estrarre il punto d'inserimento Pk di kk - foreach hh cerchi estrarre il centro Ch del cerchio hh estrarre il raggio Rh se dist.(Pk-Ch) <= Rh allora posiziona il testo nel centro del cerchio altrimenti incrementa hh - fine foreach cerchi incrementa kk fine foreach testi |
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 21 novembre 2011 : 14:55:36
|
(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))
)
(setq gruc (mapcar '(lambda (elem) (list elem (cdr (assoc 10 (entget elem))))) (ssgetli grucerchi))
grut (mapcar '(lambda (elem) (list elem (cdr (assoc 10 (entget elem))))) (ssgetli grutesti))
listadist '()
listacer '()
)
(foreach elem gruc
(foreach elemento grut
(setq listadist (append listadist (list (distance (cadr elem) (cadr elemento)))))
)
(setq
listacer (append listacer
(list (list (car elem)
(cadr elem)
(car (nth (vl-position (apply 'min listadist) listadist) grut))
(cadr (nth (vl-position (apply 'min listadist) listadist) grut))
)
)
)
)
(setq listadist nil)
)
(foreach elem listacer
(vl-cmdf "_MOVE" (caddr elem) "" (nth 3 elem) (cadr elem))
)
)
;; ****************************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))
)
)
)
)
)
|
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 21 novembre 2011 : 15:09:53
|
Messaggio inserito da Terminator
(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))
)
(setq gruc (mapcar '(lambda (elem) (list elem (cdr (assoc 10 (entget elem))))) (ssgetli grucerchi))
grut (mapcar '(lambda (elem) (list elem (cdr (assoc 10 (entget elem))))) (ssgetli grutesti))
listadist '()
listacer '()
)
(foreach elem gruc
(foreach elemento grut
(setq listadist (append listadist (list (distance (cadr elem) (cadr elemento)))))
)
(setq
listacer (append listacer
(list (list (car elem)
(cadr elem)
(car (nth (vl-position (apply 'min listadist) listadist) grut))
(cadr (nth (vl-position (apply 'min listadist) listadist) grut))
)
)
)
)
(setq listadist nil)
)
(foreach elem listacer
(vl-cmdf "_MOVE" (caddr elem) "" (nth 3 elem) (cadr elem))
)
)
;; ****************************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))
)
)
)
)
)
collaudato, purtroppo sposta i testi anche quando sono già perfettamente centrati
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 21 novembre 2011 : 16:05:58
|
Beh, vengono confermati centrati!
In effetti non ho fatto il controllo se erano già centrati, ma non si dovrebbero spostare. Prova così:
(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))
)
(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))))) (ssgetli grutesti))
listadist '()
listacer '()
)
(foreach elem gruc
(foreach elemento grut
(setq listadist (append listadist (list (distance (cadr elem) (cadr elemento)))))
)
(setq
listacer (append listacer
(list (list (car elem)
(cadr elem)
(car (nth (vl-position (apply 'min listadist) listadist) grut))
(cadr (nth (vl-position (apply 'min listadist) listadist) grut))
)
)
)
)
(setq listadist nil)
)
(foreach elem listacer
(if (not (equal (nth 3 elem)(cadr elem) 0.001))
(vl-cmdf "_MOVE" (caddr elem) "" (nth 3 elem) (cadr elem))
)
)
(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))
)
)
)
)
)
|
Modificato da - Terminator in data 21 novembre 2011 16:16:32 |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 21 novembre 2011 : 19:01:49
|
grazie Terminator funziona a patto di modificare prima la giustificazionea dei testi in MC, se si potesse inglobare anche questo passaggio è perfetto. allego un dwg di prova
Scarica allegato:
centrare_text.rar 13,64 KB |
Modificato da - arri in data 21 novembre 2011 19:18:03 |
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 21 novembre 2011 : 19:32:33
|
Messaggio inserito da arri funziona a patto di modificare prima la giustificazionea dei testi in MC, se si potesse inglobare anche questo passaggio è perfetto.
Hai ragione, sono stato pigro...
(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))
)
(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))))) (ssgetli grutesti))
listadist '()
listacer '()
)
(foreach elem gruc
(foreach elemento grut
(setq listadist (append listadist (list (distance (cadr elem) (cadr elemento)))))
)
(setq
listacer (append listacer
(list (list (car elem)
(cadr elem)
(car (nth (vl-position (apply 'min listadist) listadist) grut))
(cadr (nth (vl-position (apply 'min listadist) listadist) grut))
)
)
)
)
(setq listadist nil)
)
(foreach elem listacer
(if (not (equal (nth 3 elem)(cadr elem) 0.001))
(vl-cmdf "_MOVE" (caddr elem) "" (nth 3 elem) (cadr elem))
)
)
(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))
)
)
)
)
)
De nada |
Modificato da - Terminator in data 21 novembre 2011 21:12:03 |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 21 novembre 2011 : 19:57:41
|
uno spettacolo !!!! perfetto !!!!!!!! grazie mille Terminator |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 22 novembre 2011 : 08:38:18
|
i problemi emergono provando ... occorre prestare attenzione alla selezione perchè se ci sono testi o cerchi indipendenti, i risultati sono imprevedibili.
|
|
|
joseph
Utente Master
Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore
1884 Messaggi |
Inserito il - 22 novembre 2011 : 15:18:34
|
Questa è un'altra soluzione che controlla anche se il testo, prima dello spostamento, ha il suo punto di allineamento all'interno del cerchio: parte con TC. Da provare
Scarica allegato:
centra-testi-cerchio.LSP 1,69 KB |
Modificato da - joseph in data 22 novembre 2011 15:19:11 |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 22 novembre 2011 : 15:33:34
|
Messaggio inserito da joseph
Questa è un'altra soluzione che controlla anche se il testo, prima dello spostamento, ha il suo punto di allineamento all'interno del cerchio: parte con TC. Da provare
grazie joseph, occorre zipparlo .... non si scarica con l'estensione LSP |
|
|
joseph
Utente Master
Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore
1884 Messaggi |
Inserito il - 22 novembre 2011 : 15:38:21
|
Il codice non è lungo, è più semplice allegarlo
(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")))) (setq sel-cer (ssget "X" '((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)) ) ) (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) |
Modificato da - joseph in data 22 novembre 2011 16:53:53 |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 22 novembre 2011 : 15:47:12
|
Errore dell'applicazione: Tipo non valido inviato come input del comando
|
|
|
joseph
Utente Master
Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore
1884 Messaggi |
Inserito il - 22 novembre 2011 : 16:55:35
|
Ho fatto la correzione in rosso sul codice allegato precedentemente: dovrebbe funzionare. |
|
|
Discussione |
|