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

Variables de memoria según lista

3 participantes

Ir abajo

Variables de memoria según lista Empty Variables de memoria según lista

Mensaje por eliasp Dom Feb 04, 2024 11:10 pm

Buen día señores.

Tengo un problemita, espero poder explicarlo bien.

Resulta y resalta que, estoy leyendo áreas de figuras dentro de secciones transversales de un camino. Por decir: Corte, terraplén, base, etc. Bien, hice una rutina para leer las áreas seleccioando por medio de una lista, de esta forma: (setq lista(list "fresado""nivel""Escalon_Cajon""Recorte_hatch")), una vez que obtengo los valores, me acerco a la zona donde están los textos y voy dando clic al texto correspondiente para asignarle el valor apropiado. Hasta aquí todo bien. El problema surge cuando la sección es muy grande y no puedo tener en la pantalla a lavez las áreas y los textos, porque como todos saben, si el autocad "no ve las figuras", no las procesa.
Lo que me interesa es si me pueden apoyar en crear esas variables temporales y poder mover la visualización de la pantalla una vez obtenidas las áreas y clicar en el texto correspondiente.

Saludos y gracias

eliasp

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

Volver arriba Ir abajo

Variables de memoria según lista Empty Re: Variables de memoria según lista

Mensaje por robierzo Lun Feb 05, 2024 8:21 pm

Buenas. Yo no entiendo muy bien. Si pudieras subir un DWG con un ejemplo.
robierzo
robierzo

Mensajes : 103
Fecha de inscripción : 17/03/2016
Localización : La Coruña

http://www.selmotopografia.es

Volver arriba Ir abajo

Variables de memoria según lista Empty Re: Variables de memoria según lista

Mensaje por eliasp Vie Feb 09, 2024 5:56 pm

Una disculpa por la tardanza, pero he estado algo atareado - estresado. En fin, a ver si con la imagen o archivo queda claro.
Variables de memoria según lista Seccio11.
Como podrás ver, a la hora de leer las áreas todobien, pero cuando quiero colocar el valor correspondiente en el texto apropiado, está muy lejos. Por ahora lo he resuelto moviendo los textos, pero no es muy práctico. Por eso la consulta de, generar las variables, asignarle el valor y entonces si, acercarme a los textos y sustituir por el valor nuevo.
A ver si con la imagen queda mas claro.

Saludos y gracias.

eliasp

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

Volver arriba Ir abajo

Variables de memoria según lista Empty Re: Variables de memoria según lista

Mensaje por robierzo Dom Feb 11, 2024 7:56 am

Como dice Devitg, Autocad no procesa imágenes y ayuda poco. Pero bueno, por lo que yo entiendo, deberías crear una lista con los valores asociados a cada tipo de área, por ejemplo:
1º-. (("fresado" 32.63)("nivel" 63.14)("Escalon_Cajon" 24.6)("Recorte_hatch" 32.14)....)
2º-. Seleccionar los textos a modificar. Como no sabemos si los textos están en columnas, o es un sólo texto, o es un mtext...., en función de cómo estén, tendrás que identificar cada texto de una u otra manera, para poder asociar los valores correctos de la lista creada en el punto 1º.

A priopri, no parece muy complicado. Pero sin ver el DWG.....
Y si eres muy ordenado, y las distintas superficies las tienes creadas por capas y/o colores, con un par de selecciones se podría resolver el problema, sin necesidad de ir indicando una a una cada superficie. Pero bueno, como digo, depende de cómo esté estructurado el dibujo.
robierzo
robierzo

Mensajes : 103
Fecha de inscripción : 17/03/2016
Localización : La Coruña

http://www.selmotopografia.es

Volver arriba Ir abajo

Variables de memoria según lista Empty Re: Variables de memoria según lista

Mensaje por eliasp Dom Feb 11, 2024 8:23 pm

Bien, primero que nada, gracias por interesarte en mi problema, "creí que... pensé que" con la pura imagen estaría claro.

https://we.tl/t-WhwTuQs7Wj

Énvío un enlace de wetransfer donde anexo un DWG, un lsp y un video donde muestro como lo hago, motivo por el cual quiero optimizarlo....
Espero que ahora si quede claro.
Muchas gracias

eliasp

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

Volver arriba Ir abajo

Variables de memoria según lista Empty Re: Variables de memoria según lista

Mensaje por Gerardo Calvo Dom Feb 11, 2024 9:58 pm

Elías. Amigo!
Yo (que conozco un poco de tus procesos) no logro entender el problema (hace días vi el hilo pero no le encuentro el lado a la pregunta)

El unico momento en que autocad puede darte resultados inesperados por estar fuera de foco es al seleccionar con ssget sin interaccion del usuario. Por ejemplo con (ssget "_W"pt1 pt2 ... (ssget "_F" lista-de-puntos...  (ssget "_CP" lista-de-puntos... etc

Pero si tienes las secciones el usuario de la rutina (tú jeje) debe necesariamente seleccionar en pantalla los objetos o las areas, y en el momento de seleccionar puedes y debes utilizar herramientas de zoom con el mouse para localizar y marcar tus selecciones.

Guardas esas selecciones en variables, que entiendo que es tu pregunta pero no entiendo como no sabrías hacerlo habiendo visto otros códigos tuyos mucho más complejos que eso. Y luego, sin importar donde esté el zoom ya puedes obtener las áreas y colocar los valores porque autocad no va a volver a seleccionar para obtener las áreas sino que va a obtenerlas desde lo que ya tienes inequivocamente en tus variables.

Supongo que si quieres seleccionar por hatches -que cada hatch abarca todas las áreas del mismo tipo- sería algo así:
(setq fresado (car (entsel "hatch de fresado")))
(setq relleno (car (entsel "hatch de relleno")))
(setq cajones (car (entsel "hatch de cajones")))
y luego
(setq texto-fresado (car (entsel "texto del fresado")))
(set-property objtextofresado 'text (rtos (get-property objfresado 'area) 2 2)))  
-(o con (entmod o (command "tedit" o cualquier otro metodo para colocar el area obtenida
(setq texto-relleno....
(setq texto-cajones...

y si es seleccionando por poligonos que puedes tener que sumar áreas porque varios polígonos representen un mismo rubro
(princ "seleccionar fresado")
(setq fresado (ssget '((0 . "LWPOLYLINE")(-4 . "&=")(70 . 1))))
(princ "seleccionar relleno")
(setq relleno (ssget '((0 . "LWPOLYLINE")(-4 . "&=")(70 . 1))))
y luego lo que sabemos para recorrer el ssget tomando el área de cada polígono de ese ssget:
(setq areafresado 0.0)
(repeat (sslength fresado)
 (setq entidad (ssname fresado iterador))
 (setq areafresado (+ areafresado (-propiedad area de entidad-)...
etc
etc

¿Será que no he comprendido bien tu pregunta y se me escapa algo importante o que es tan resimple que no lo viste y decidirte ir por un camino mucho más complejo?

Saludos

Gerardo Calvo

Mensajes : 46
Fecha de inscripción : 29/10/2019

Volver arriba Ir abajo

Variables de memoria según lista Empty Re: Variables de memoria según lista

Mensaje por robierzo Lun Feb 12, 2024 9:46 am

Prueba esta rutina. No hay que seleccionar nada. Sólo la ejecutas mediante el comando perfiles y ya te cambia todos los valores.
Sólo existe una condición: que los textos de las áreas deber estar en la capa "areas", ya que ese es el modo de selección y discriminación de resto de textos.

Si además, quieres cambiar el color del texto, tal como muestras en el vídeo, lo puedes implementar en la función "escribe_textos" y listo.
Código:
(defun escribe_textos (tipo area_hatch /)
  (setq sublista (car(vl-remove-if-not '(lambda (x)(= (cadr x) tipo)) lista_textos)))
  (setq y_texto_sublista (caddr sublista))
  (setq sublistas_y (vl-remove-if-not '(lambda (x)(= (caddr x) y_texto_sublista)) lista_textos));las dos sublistas con la misma y
  (setq sublista_y (car(vl-remove-if '(lambda (x)(= (cadr x) tipo)) sublistas_y)));lista con el texto a cambiar
  (setq nueva_lista (subst (cons 1 (rtos area_hatch 2 3)) (assoc 1 (entget(car sublista_y))) (entget (car sublista_y))))
  (entmod nueva_lista)
)
 
 
(defun c:perfiles ()
  (command "_zoom" "_e")
  (setq conj_perfiles nil)
  (setq conj_textos nil conj_z_fresado nil conj_z_nivel nil conj_esc_de_liga nil conj_Recorte_Hatch nil)
  (setq conj_perfiles (ssget "X" '((8 . "CM1021I1_Terreno")(0 . "LWPOLYLINE"))))
  (setq n 0)
  (repeat (sslength conj_perfiles)
    (setq lista_coordenadas_poli nil lista_textos nil)
    (setq nombre_ent (ssname conj_perfiles n))
    ;calculamos las coordenadas de la lwpolyline
    (foreach el1 (entget nombre_ent)
      (if (= (car el1) 10) (setq lista_coordenadas_poli (cons (cdr el1) lista_coordenadas_poli)))
    )
    ;calculamos máximos y mínimos
    (setq X_Maxima (apply 'max (mapcar 'car lista_coordenadas_poli)))
    (setq Y_Maxima (apply 'max (mapcar 'cadr lista_coordenadas_poli)))
    (setq X_Minima (apply 'min (mapcar 'car lista_coordenadas_poli)))
    (setq Y_Minima (apply 'min (mapcar 'cadr lista_coordenadas_poli)))
    (setq pt1 (list (1- X_Minima) (1+ Y_Maxima)) pt2 (list (+ 6 X_Maxima) (1- Y_Minima)))
    ;seleccionamos textos
    (setq conj_textos  (ssget "_W" pt1 pt2 '((0 . "TEXT") (8 . "areas"))))
    (setq n1 0)
    (repeat (sslength conj_textos)
      (setq lista_n nil)
      (setq nombre_texto (ssname conj_textos n1))
      (setq contenido (cdr (assoc 1 (entget nombre_texto))))
      (setq y_texto (caddr(assoc 10 (entget nombre_texto))))
      (setq lista_n (list nombre_texto contenido y_texto))
      (setq lista_textos (cons lista_n lista_textos))
      (setq n1 (1+ n1))
    );fin REPEAT
         
    ;seleccionamos sombreados
    (setq conj_z_fresado (ssget "_W" pt1 pt2 '((8 . "z-fresado") (0 . "HATCH"))))
    (setq conj_z_nivel (ssget "_W" pt1 pt2 '((8 . "z-nivel") (0 . "HATCH"))))
    (setq conj_esc_de_liga (ssget "_W" pt1 pt2 '((8 . "Esc De Liga") (0 . "HATCH"))))
    (setq conj_Recorte_Hatch (ssget "_W" pt1 pt2 '((8 . "Recorte_hatch") (0 . "HATCH"))))
    ;cambiamos textos
    (cond ((/= conj_z_fresado nil)
     (setq nombre_hatch (ssname conj_z_fresado 0))
     (setq obj_hatch (vlax-ename->vla-object nombre_hatch));Crea objeto VLA
     (setq area_hatch (vlax-get-property obj_hatch "Area"))
     (escribe_textos "FRESADO" area_hatch)
     )
    )
    (cond ((/= conj_z_nivel nil)
     (setq nombre_hatch (ssname conj_z_nivel 0))
     (setq obj_hatch (vlax-ename->vla-object nombre_hatch));Crea objeto VLA
     (setq area_hatch (vlax-get-property obj_hatch "Area"))
     (escribe_textos "RENIVELACIÓN" area_hatch)
     )
    )
    (cond ((/= conj_esc_de_liga nil)
     (setq nombre_hatch (ssname conj_esc_de_liga 0))
     (setq obj_hatch (vlax-ename->vla-object nombre_hatch));Crea objeto VLA
     (setq area_hatch (vlax-get-property obj_hatch "Area"))
     (escribe_textos "ESCALON DE LIGA" area_hatch)
     )
    )
    (cond ((/= conj_Recorte_Hatch nil)
     (setq nombre_hatch (ssname conj_Recorte_Hatch 0))
     (setq obj_hatch (vlax-ename->vla-object nombre_hatch));Crea objeto VLA
     (setq area_hatch (vlax-get-property obj_hatch "Area"))
     (escribe_textos "RECORTE" area_hatch)
     )
    )
    (setq n (1+ n))
  );fin REPEAt
);FIN defun
robierzo
robierzo

Mensajes : 103
Fecha de inscripción : 17/03/2016
Localización : La Coruña

http://www.selmotopografia.es

Volver arriba Ir abajo

Variables de memoria según lista Empty Re: Variables de memoria según lista

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.