acad hispano
¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.

Interlineado de textos independientes

2 participantes

Ir abajo

Interlineado de textos independientes Empty Interlineado de textos independientes

Mensaje por eliasp Mar Jul 18, 2023 6:42 am

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.
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" "")
  )
Este es el código que hice para acomodarlos, pero como les comento, es muy lento, porque son cientos de columnas...

Aquí está el archivo de muestra.
https://we.tl/t-vwBeeXZkEe

Estos son columnas de muestra:
Interlineado de textos independientes Tresco10


Gracias

eliasp

Mensajes : 195
Fecha de inscripción : 17/03/2016

Volver arriba Ir abajo

Interlineado de textos independientes Empty Re: Interlineado de textos independientes

Mensaje por Gerardo Calvo Mar Jul 18, 2023 6:53 pm

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

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

Volver arriba Ir abajo

Interlineado de textos independientes Empty Re: Interlineado de textos independientes

Mensaje por eliasp Miér Jul 19, 2023 6:34 am

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....

eliasp

Mensajes : 195
Fecha de inscripción : 17/03/2016

A Gerardo Calvo le gusta esta publicaciòn

Volver arriba Ir abajo

Interlineado de textos independientes Empty Re: Interlineado de textos independientes

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.