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 Precedente
Autore Discussione Precedente Discussione Discussione Successiva
Pagina: di 2

arri
Utente Master


Regione: Lombardia


14951 Messaggi

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

joseph
Utente Master



Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore


1884 Messaggi

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

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 22 novembre 2011 : 19:08:10  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
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ì)


Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 22 novembre 2011 : 21:07:52  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
Il problema potrebbe sussistere se il testo si trova al di là del cerchio...
Torna all'inizio della Pagina

joseph
Utente Master



Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore


1884 Messaggi

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

Terminator
Utente Master



725 Messaggi

Inserito il - 23 novembre 2011 : 06:36:13  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
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.
Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 23 novembre 2011 : 08:00:25  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
@ joseph e Terminator

va benissimo così,
grazie di nuovo a entrambi
Torna all'inizio della Pagina

joseph
Utente Master



Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore


1884 Messaggi

Inserito il - 23 novembre 2011 : 10:02:28  Mostra Profilo Invia a joseph un Messaggio Privato  Rispondi Quotando
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
)
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 23 novembre 2011 : 10:37:49  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
@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
)
Torna all'inizio della Pagina

joseph
Utente Master



Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore


1884 Messaggi

Inserito il - 23 novembre 2011 : 11:29:09  Mostra Profilo Invia a joseph un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

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

Terminator
Utente Master



725 Messaggi

Inserito il - 23 novembre 2011 : 12:54:00  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
La prima mi crea un insieme di selezione di entità normali, la seconda entità vla-object, quindi valide tutte e due.
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

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

arri
Utente Master


Regione: Lombardia


14951 Messaggi

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

Terminator
Utente Master



725 Messaggi

Inserito il - 29 novembre 2011 : 21:17:07  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
Ho solo cercato di considerare il testo non proprio rigidamente vicino al cerchio, ma anche un po' più lontano. Più "elastico", insomma.
Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 30 novembre 2011 : 08:05:02  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 30 novembre 2011 : 08:23:12  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
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

Modificato da - arri in data 30 novembre 2011 08:41:41
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 30 novembre 2011 : 08:53:36  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 30 novembre 2011 : 09:07:19  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
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.
Torna all'inizio della Pagina
Pagina: di 2 Discussione Precedente Discussione Discussione Successiva  
Pagina Precedente
 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 1,34 secondi.