TuttoCAD Forum

TuttoCAD Forum
[ Home | Registrati | Discussioni Attive | Discussioni Recenti | Segnalibro | Msg privati | Sondaggi Attivi | Utenti | Album Fotografico | Download | | Cerca | FAQ ]
Nome Utente:
Password:
Salva Password
Password Dimenticata?

 Tutti i Forum
 1 - TuttoCAD Software
 AutoLISP
 Centrare text nei cerchi
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
I seguenti utenti stanno leggendo questo Forum Qui c'è:
Pagina Successiva
Autore Discussione Precedente Discussione Discussione Successiva
Pagina: di 2

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 21 novembre 2011 : 09:37:22  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
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  Mostra Profilo Invia a joseph un Messaggio Privato  Rispondi Quotando
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.
Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 21 novembre 2011 : 11:20:19  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

Aniello Annunziata
Amministratore



Regione: Campania
Prov.: Napoli
Città: San Giuseppe Vesuviano


2302 Messaggi

Inserito il - 21 novembre 2011 : 12:33:23  Mostra Profilo Invia a Aniello Annunziata un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 21 novembre 2011 : 12:35:23  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
Messaggio inserito da Aniello Annunziata

La parte difficile è la verifica.


precisamente !

Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 21 novembre 2011 : 12:57:01  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
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.
Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 21 novembre 2011 : 13:00:46  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

GP
Utente Master


Regione: Piemonte
Prov.: Vercelli


2776 Messaggi

Inserito il - 21 novembre 2011 : 13:51:31  Mostra Profilo Invia a GP un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

joseph
Utente Master



Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore


1884 Messaggi

Inserito il - 21 novembre 2011 : 14:00:57  Mostra Profilo Invia a joseph un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 21 novembre 2011 : 14:55:36  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
(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))
		)
   )
  )
 )
)


Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 21 novembre 2011 : 15:09:53  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
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

Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 21 novembre 2011 : 16:05:58  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 21 novembre 2011 : 19:01:49  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 21 novembre 2011 : 19:32:33  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 21 novembre 2011 : 19:57:41  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
uno spettacolo !!!!
perfetto !!!!!!!!
grazie mille Terminator
Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 22 novembre 2011 : 08:38:18  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
i problemi emergono provando ...
occorre prestare attenzione alla selezione perchè se ci sono testi o cerchi indipendenti, i risultati sono imprevedibili.

Torna all'inizio della Pagina

joseph
Utente Master



Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore


1884 Messaggi

Inserito il - 22 novembre 2011 : 15:18:34  Mostra Profilo Invia a joseph un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 22 novembre 2011 : 15:33:34  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

joseph
Utente Master



Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore


1884 Messaggi

Inserito il - 22 novembre 2011 : 15:38:21  Mostra Profilo Invia a joseph un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 22 novembre 2011 : 15:47:12  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
Errore dell'applicazione: Tipo non valido inviato come input del comando

Torna all'inizio della Pagina

joseph
Utente Master



Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore


1884 Messaggi

Inserito il - 22 novembre 2011 : 16:55:35  Mostra Profilo Invia a joseph un Messaggio Privato  Rispondi Quotando
Ho fatto la correzione in rosso sul codice allegato precedentemente: dovrebbe funzionare.
Torna all'inizio della Pagina
Pagina: di 2 Discussione Precedente Discussione Discussione Successiva  
Pagina Successiva
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
Vai a:
TuttoCAD Forum © 2001-2010 CADLandia Torna all'inizio della Pagina
Pagina generata in 0,66 secondi.