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

Nota: Devi essere registrato per poter inserire un messaggio.
Per registrarti, clicca qui. La Registrazione è semplice e gratuita!

Larghezza finestra:
Nome Utente:
Password:
Modo:
Formato: GrassettoCorsivoSottolineatoBarrato Aggiungi Spoiler Allinea a  SinistraCentraAllinea a Destra Riga Orizzontale Inserisci linkInserisci EmailInserisci FlashInserisci Immagine Inserisci CodiceInserisci CitazioneInserisci Lista
   
Icona Messaggio:              
             
Messaggio:

  * Il codice HTML è OFF
* Il Codice Forum è ON

Faccine
Felice [:)] Davvero Felice [:D] Caldo [8D] Imbarazzato [:I]
Goloso [:P] Diavoletto [):] Occhiolino [;)] Clown [:o)]
Occhio Nero [B)] Palla Otto [8] Infelice [:(] Compiaciuto [8)]
Scioccato [:0] Arrabbiato [:(!] Morto [xx(] Assonnato [|)]
Bacio [:X] Approvazione [^] Disapprovazione [V] Domanda [?]
Seleziona altre faccine

    
 
   

V I S U A L I Z Z A    D I S C U S S I O N E
arri 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

20   U L T I M E    R I S P O S T E    (in alto le più recenti)
arri 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.
Terminator 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...
arri Inserito il - 30 novembre 2011 : 08:23:12
Messaggio inserito da Terminator

Non vedo il dwg allegato


(il dwg è allegato qui)

grazie Terminator, ma lascia perdere questa questione,

preferirei che mettessi un controllo all'altro lisp

http://www.cadlandia.com/forum/topic.asp?TOPIC_ID=12317&SearchTerms=attributi%20sincronizzati

per evitare sincronizzazioni non volute
arri 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
Terminator 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 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 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)
Terminator 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.
arri 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
joseph 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
)

Terminator 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 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
)
arri Inserito il - 23 novembre 2011 : 08:00:25
@ joseph e Terminator

va benissimo così,
grazie di nuovo a entrambi
Terminator 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.
joseph 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 Inserito il - 22 novembre 2011 : 21:07:52
Il problema potrebbe sussistere se il testo si trova al di là del cerchio...
arri 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ì)


joseph 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 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))
)
joseph Inserito il - 22 novembre 2011 : 16:55:35
Ho fatto la correzione in rosso sul codice allegato precedentemente: dovrebbe funzionare.

TuttoCAD Forum © 2001-2010 CADLandia Torna all'inizio della Pagina
Pagina generata in 0,23 secondi.