Interlineado de textos independientes
2 participantes
Página 1 de 1.
Interlineado de textos independientes
Buen día señores.
Tengo varios archivos de secciones transversales. Cada sección tiene textos en dos columnas, una de textos y otra con valores que indican la áreas de las figuras. El asunto está en que son varios archivos que trabajaron distintas personas.
Algunas de ellas no estan con espacio constante entre los renglones, otras tienen demasiado espacio.
Hice una rutina para acomodarlos con espacio constante, pero lo hago dando clic en cada texto y pues es muy tardado.
El maestro DEVITG, me ayudó con una rutina, pero encontramos que altera el orden de las columnas y ya no se corresponden los textos con sus valores. Espero haber sido claro. Anexo un archivo que tiene una muestra de los textos. Es sólo una pequeña muestra, puesto que son cientos de columnas.
La intención es acomodar los renglones con espacio constante conservando el orden.
Aquí está el archivo de muestra.
https://we.tl/t-vwBeeXZkEe
Estos son columnas de muestra:
Gracias
Tengo varios archivos de secciones transversales. Cada sección tiene textos en dos columnas, una de textos y otra con valores que indican la áreas de las figuras. El asunto está en que son varios archivos que trabajaron distintas personas.
Algunas de ellas no estan con espacio constante entre los renglones, otras tienen demasiado espacio.
Hice una rutina para acomodarlos con espacio constante, pero lo hago dando clic en cada texto y pues es muy tardado.
El maestro DEVITG, me ayudó con una rutina, pero encontramos que altera el orden de las columnas y ya no se corresponden los textos con sus valores. Espero haber sido claro. Anexo un archivo que tiene una muestra de los textos. Es sólo una pequeña muestra, puesto que son cientos de columnas.
La intención es acomodar los renglones con espacio constante conservando el orden.
- Código:
(defun c:zmueve()
(command "_undo" "_begin")
(setq ind 1)
(setq base(vlax-ename->vla-object(car(entsel "\n Texto Base..."))))
(Setq ptobase(vlax-safearray->list(vlax-variant-value(vlax-get-property base 'insertionpoint))))
(setq pto2(polar ptobase(* pi 0)6))
(vlax-invoke-method base "move" (vlax-3d-point ptobase)(vlax-3d-point pto2))
(Setq base2(vlax-safearray->list(vlax-variant-value(vlax-get-property base 'insertionpoint))))
(setq pto4(polar base2(* pi 1.5)0.35))
(while(/=(setq mover(car(entsel "\n Texto a Mover...")))nil)
(setq mover(vlax-ename->vla-object mover))
(setq pto3(vlax-safearray->list(vlax-variant-value(vlax-get-property mover 'insertionpoint))))
(vlax-invoke-method mover "move" (vlax-3d-point pto3)(vlax-3d-point pto4))
(setq pto4(vlax-safearray->list(vlax-variant-value(vlax-get-property mover 'insertionpoint))))
(setq pto4(polar pto4(* pi 1.5)0.35))
(setq ind(1+ ind))
)
;;; (setq base2 nil ind nil pto2 nil pto3 nil pto4 nil ptobase nil)
(setq conj(ssget))
(vl-cmdf "_.move" conj "" "-6,0" "")
)
Aquí está el archivo de muestra.
https://we.tl/t-vwBeeXZkEe
Estos son columnas de muestra:
Gracias
eliasp- Mensajes : 195
Fecha de inscripción : 17/03/2016
Re: Interlineado de textos independientes
Hola Elias
Interesante requerimiento para dejar volar la imaginación. Sin embargo lo que pides parece muy sencillo. En vez de seleccionar un texto a la vez con entsel puedes seleccionar todos de una sola vez con ssget, luego ordenarlos por su coordenada Y y asignarles en ese orden una nueva coordenada que vas calculando sumando cada vez un incremento o decremento fijo. No deberías tener mayor complicación
Ahora, como a mi me gusta complicarme la vida hice este código, pensando, que pasa si el usuario selecciona libremente una columna o ambas y la rutina reconoce si se trata de una o dos columnas. Y que pasa si quisiéramos que la columna de la derecha se alineara por la derecha, para que si hay valores con más dígitos queden mejor alineados?
Y eso hace este código además de temas de estilo. Quizás más de lo que necesitas, pero como siempre tómalo con carácter didáctico, al menos como ejemplo de como ordenar una selección completa de textos en columna
Fijate que si seleccionas ambas columnas de una sola vez los textos se dividen a izquierda y derecha del X promedio, y así se diferencian las columnas, que se empezarán a distanciar de arriba hacia abajo. Eso quiere decir que si de un lado quedan más textos que del otro una de las columnas quedará más corta y posiblemente se pierda la concidencia entre items y sus valores, por lo que siempre deberían estar equiparadas ambas columnas. En fin pruébalo y me cuentas.
Saludos estimado
Interesante requerimiento para dejar volar la imaginación. Sin embargo lo que pides parece muy sencillo. En vez de seleccionar un texto a la vez con entsel puedes seleccionar todos de una sola vez con ssget, luego ordenarlos por su coordenada Y y asignarles en ese orden una nueva coordenada que vas calculando sumando cada vez un incremento o decremento fijo. No deberías tener mayor complicación
Ahora, como a mi me gusta complicarme la vida hice este código, pensando, que pasa si el usuario selecciona libremente una columna o ambas y la rutina reconoce si se trata de una o dos columnas. Y que pasa si quisiéramos que la columna de la derecha se alineara por la derecha, para que si hay valores con más dígitos queden mejor alineados?
Y eso hace este código además de temas de estilo. Quizás más de lo que necesitas, pero como siempre tómalo con carácter didáctico, al menos como ejemplo de como ordenar una selección completa de textos en columna
- Código:
(defun c:zmueve2 ( / HTX sep gc:fix i ss ent lent mtx pt w tmp L L1 L2 x xmed 2cols caso X1 X2 Yit )
;valor de altura de texto que se asignará y usará para calcular separaciones
(setq HTX 0.25
sep (* HTX 3.)
)
;si no existe el estilo de texto crearlo
(if (null (tblsearch "STYLE" "Textos_Seccion"))
(entmake '( (0 . "STYLE") (100 . "AcDbSymbolTableRecord") (100 . "AcDbTextStyleTableRecord")
(2 . "Textos_Seccion") (70 . 0) (40 . 0.0) (41 . 1.0) (50 . 0.0) (71 . 0) (3 . "arial.ttf") )
)
)
;Función que desplaza un texto al X y Y indicados. Y asigna estilo, altura y la justificación
;izquierda o derecha según el parametro izq
(defun gc:fix (nent X Y izq / lent)
(setq lent (entget nent))
(entmod
(if (= (cdr (assoc 0 lent)) "MTEXT")
(append
(vl-remove-if
'(lambda (A)
(member (car A) '(10 40 7 71))
)
lent
)
(list
'(7 . "Textos_Seccion")
(list 10 X Y 0.)
(cons 40 HTX)
(cons 71 (if izq 7 9))
)
)
(append
(vl-remove-if
'(lambda (A)
(member (car A) '(10 11 40 41 7 72 73))
)
lent
)
(list
'(7 . "Textos_Seccion")
(list 10 X Y 0.)
(cons 40 HTX)
(cons 72 (if izq 0 2))
'(73 . 0)
)
(if (not izq) (list (list 11 X Y 0.)))
)
)
)
)
;Si se seleccionan textos/mtextos procesarlos
(if (setq i 0
ss (ssget '((0 . "*TEXT")))
)
(progn
(repeat (sslength ss)
(setq ent (ssname ss i)
i (1+ i)
lent (entget ent)
mtx (= (cdr (assoc 0 lent)) "MTEXT")
pt (cdr
(assoc
(if
(and
(not mtx)
(or
(not (zerop (cdr (assoc 72 lent))))
(not (zerop (cdr (assoc 73 lent))))
)
)
11
10
)
lent
)
)
;Ancho de referencia del texto. Es el ancho real que ocupa, entre su altura y factor
;de ancho actual por la altura deseada, para obtener el ancho que ocupará cuando la
;altura sea de HTX y el factor de ancho de 1.0
W (* HTX
(if mtx
(/ (cdr (assoc 42 lent))
(cdr (assoc 41 (tblsearch "STYLE" (cdr (assoc 7 lent)))))
(cdr (assoc 40 lent))
)
(/ (- (caadr (setq tmp (textbox lent)))
(caar tmp)
)
(cdr (assoc 41 lent))
(cdr (assoc 40 lent))
)
)
)
L (cons
(list (car pt) (cadr pt) w ent)
L
)
)
)
(if
(setq XS (mapcar 'car L)
xmed (/ (apply '+ XS) (length L)) ;coord X promedio
; Si 2cols obtiene T, es que la diferencia entre coordenadas X del texto más izquierdo
; y el más derecho es mayor que el ancho del texto más largo. En este caso se asume que
; hay dos columnas. (si obtiene nil se asumirá una sola columna)
2cols (> (- (apply 'max XS) (apply 'min XS) )
(apply 'max (mapcar 'caddr L))
)
)
;si se asumen 2 columnas separar los textos de izquierda y derecha de la X promedio
(progn
(foreach caso L
(if (< (car caso) xmed)
(setq L1 (cons caso L1))
(setq L2 (cons caso L2))
)
)
(setq X1 (/ (apply '+ (mapcar 'car L1)) (length L1)) ;X promedio de la primera lista
L1 (vl-sort L1 '(lambda(T1 T2) (> (cadr T1)(cadr T2)))) ;L1 ordenada verticalmente
L2 (vl-sort L2 '(lambda(T1 T2) (> (cadr T1)(cadr T2)))) ;L2 ordenada verticalmente
Yit (max (cadar L1)(cadar L2)) ;Y mayor
;X2=> desplaz. desde X1= ancho max col1 + separ(4*htx) + ancho máx col2. Con esto
; se puede justificar la columna izquierda por la izquierda y la derecha por la derecha
; dejando una separación fija entre ambas
X2 (+ X1 (apply 'max (mapcar 'caddr L1)) (apply 'max (mapcar 'caddr L2)) (* sep 1.5))
)
)
;si solo hay una columna ordenarla
(setq L1 (vl-sort L '(lambda(T1 T2) (> (cadr T1)(cadr T2))))
X1 (caar L1)
Yit (cadar L1)
)
)
;ir desplazando cada entrada de la(s) lista(s), con la respectiva justificación derecha de la
;segunda columna si la hubiere
(while (or L1 L2)
(if L1
(progn
(gc:fix (last (car L1))X1 Yit t)
(setq L1 (cdr L1))
)
)
(if L2
(progn
(gc:fix (last (car L2))X2 Yit nil)
(setq L2 (cdr L2))
)
)
(setq Yit (- Yit sep))
)
)
)
)
Fijate que si seleccionas ambas columnas de una sola vez los textos se dividen a izquierda y derecha del X promedio, y así se diferencian las columnas, que se empezarán a distanciar de arriba hacia abajo. Eso quiere decir que si de un lado quedan más textos que del otro una de las columnas quedará más corta y posiblemente se pierda la concidencia entre items y sus valores, por lo que siempre deberían estar equiparadas ambas columnas. En fin pruébalo y me cuentas.
Saludos estimado
Gerardo Calvo- Mensajes : 46
Fecha de inscripción : 29/10/2019
A robierzo le gusta esta publicaciòn
Re: Interlineado de textos independientes
WOW....wow....
Maestrooo....
Ni que decir, simplemente fantástico.
Siendo honestos si se me ocurrió lo de las coordenadas pero, no supe como atacar el problema. La verdad es que está muy didactica.
Muchísimas gracias maestro.
MAESTRAZO....
Maestrooo....
Ni que decir, simplemente fantástico.
Siendo honestos si se me ocurrió lo de las coordenadas pero, no supe como atacar el problema. La verdad es que está muy didactica.
Muchísimas gracias maestro.
MAESTRAZO....
eliasp- Mensajes : 195
Fecha de inscripción : 17/03/2016
A Gerardo Calvo le gusta esta publicaciòn
Temas similares
» Interlineado de textos independientes
» Filtar textos
» Sentido de Textos
» Subrayar textos
» Sumadora de Textos
» Filtar textos
» Sentido de Textos
» Subrayar textos
» Sumadora de Textos
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.
|
|