AutoCad - XDATA, para qué sirve y cómo funciona ( Por Favor ) !!

 
Vista:
Imágen de perfil de duke

XDATA, para qué sirve y cómo funciona ( Por Favor ) !!

Publicado por duke (13 intervenciones) el 04/05/2024 04:13:22
Hola amigos ‼‼
Me preguntaba acerca del XDATA,
para qué sirve y cómo funciona dentro de AUTO-LISP ❓
Porque no sé exactamente si funciona para lo que estoy pensando.
Será que, se pueden ir creando objetos, por ejemplo:
CÍRCULOS y asignarle internamente a cada círculo un dato interno a cada uno, para que todos y cada uno de los círculos tengan un "NOMBRE" único e irrepetible y totalmente identificable ❓❓
Ejemplo:
Para unir todos los círculos en una polilínea, en un orden específico, digamos del círculo llamado internamente con un número 1 (UNO), hasta el circulo número 5 (CINCO).
O el XDATA no se usa así ❓❓
Puse eso como ejemplo, pero si se usa para otras cosas, podrían escribirme un pequeñito código de ejemplo para comprender cómo es que trabaja el XDATA, por favor ❓❓
Algo muy simple y pequeñito, se podrá ❓❓
Y de antemano, muchísimas gracias ‼‼
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 1.285
Oro
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

XDATA, para qué sirve y cómo funciona ( Por Favor ) !!

Publicado por Gerardo (997 intervenciones) el 04/05/2024 08:16:23
Hola

Exactamente es algo muy cercano a lo que estás pensando.

Hay dos formas de incluir datos en los dibujos que se guarden y puedan ser extraídos y usados en otras sesiones de dibujo: diccionarios y xdata. La diferencia es que los diccionarios son estructuras de información en forma de arbol de directorios parte del dwg, no de las entidades, que puedes crear como quieras casi sin restricciones det tipo o cantidad de información y luego cada entidad se vincula a uno o varios nodos de diccionario si lo necesitas, mientras que la xdata es información que se guarda directamente en a la definición de una entidad, pero el tipo y la cantidad de información si es más restringido.

Es programación un poco avanzada y no se explica todo en unos párrafos pero aquí tienes algunas ideas generales y un ejemplo:

1-La xdata siempre va vinculada a una aplicación, que puedes registrar con la funcion regapp. En la definición de la entidad vienen primero los datos comunes (tipo, capa, color, coordenadas, etc) y luego la xdata ordenada como así [ ("Aplicacion1" dato1 dato2 dato3) ("Aplicacion2" dato1 dato2)...] Si quieres agregar u obtener la informacion la buscas por el nombre de la aplicación

2-La xdata es parte de la definción de una entidad. Si copias la entidad la copia tendrá la misma xdata que la entidad original.

3-Puedes hacer maravillas con rutinas, pero el cad ya trae un comando para agregar xdata a entidades y otro para obtenerla. Están en el menú de "express tools", panel "Tools", botones "Attach xdata" y "list xdata" o por línea de comandos los comandos son XDATA y XDLIST

4-Si programas con autolisp puro, puedes crearla y leerla con listas DXF (entmake, entmod y entget). El código inicial en dxf es -3. Para leer la xdata en las listas de definición se le pasa el nombre de aplicación a entget. Por ejemplo (entget entidad '("ACAD" "MIAPP")) extrae solo la xdata de las aplicaciones ACAD y MIAPP pero si pones un asterisco se extrae completa. (entget entidad '("*")) Y si en cambio programas con Vlisp (ActiveX) puedes usar los métodos GetXdata y SetXdata de cada objeto. Por ejemplo (vlax-invoke-method objeto 'GetXdata "APLICACION" tipo variante-para-el-valor)


5-Puedes anexarle xdata casi a cualquier objeto o entidad: a una capa, a un estilo, a una inserción de bloque, a la definición del bloque, a una presentación...

6-Autocad utiliza xdata para guardar por ejemplo overrides de dimensiones o vinculos a escalas anotativas. Para verla en accion puedes por ejemplo dibujar una cota, editarle manualmente el tamaño de texto o de flecha y luego inspeccionar la xdata con (assoc -3 (entget (car (entsel)) '("*")))

7-El sitio que a mi gusto mejor lo explica es afralisp (es en inglés pero las explicaciones son muy completas). Con lo que hay ahí y la ayuda del autocad lo aprendes sin problema. Date una vuelta por aquí--> https://www.afralisp.net/autolisp/tutorials/extended-entity-data-part-1.php



Y ahora el ejemplo. Justo lo que propones, numerar círculos y unirlos con una polilínea:
Este lisp define 2 funciones: crear que traza circulos integrandoles un número consecutivo como xdata y obtener que lee esa xdata, ordena los circulos por el número y usa las coordenadas de los centros ya ordenados para crear una polilinea. Está programado con listas de entidad que es el metodo que yo más uso, pero si usas ActiveX la lógica de las funciones es la misma.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
;Registrar la aplicación
(regapp "EjemploDuke")
 
 
;Función que cuenta un número consecutivo y crea un círculo con ese número como xdata
(defun c:crear nil
	(setq i 1		;contador de numeros
			rad (cons 40 (/ (getvar "viewsize") 30)) ;cualquier radio para círculos
	)
	(repeat 5
		;crear un círculo
		(entmake
			(list
				'(0 . "CIRCLE")
				(cons 10 (getpoint (strcat "\nPunto para el círculo # " (itoa i) ":")))
				rad
				(cons 62 i)
				;aquí la xdata
				(list
					-3
					(list
						"EjemploDuke"
						(cons 1071 i)
					)
				)
			)
		)
		;incrementar
		(setq i (1+ i))
	)
)
;función que toma una selección de círculos,
;los ordena según el número dentro de la xdata
;y los une en orden con una polilínea
(defun c:obtener ( / i ss cantidad lstdef xdata numero lista)
	(if (setq i 0
				 ss (ssget '((0 . "CIRCLE")))
		)
		;si hay una selección de círculos
		(repeat (sslength ss)
			;para cada elemento en la selección
			(if
				(setq	entidad	(ssname ss i)
						i			(1+ i)
						lstdef	(entget entidad '("EjemploDuke"))
						xdata		(cdadr (assoc -3 lstdef))
						numero	(cdr (assoc 1071 xdata))	;numeros enteros de xdata llevan código dxf 1071
				)
				;si había un valor de número guardarlo en la lista junto con las coordenadas
				(setq lista (cons
									(cons numero (cdr (assoc 10 lstdef)))
									lista
								) ;<-- Cada entrada de esta lista es de la forma (# x y z)
				)
			)
		)
	)
	;si lista tiene al menos dos círculos trazar la polilínea
	(if (cdr lista)
		(entmake
			(append
				'((0 . "LWPOLYLINE")(100 . "AcDbEntity")(100 . "AcDbPolyline")(70 . 0))
				(list (cons 90 (length lista)))
				(mapcar
					;reemplazar el número de punto por un 10 para usarlo como vértice de la polilínea
					'(lambda(A)
						(cons 10 (cdr A)) ;<--cód 10 define vertice de polilinea
					)
					;ordenar la lista por el número
					(vl-sort
						lista
						'(lambda (B C) (< (car B) (car C)))
					)
				)
			)
		)
	)
)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de duke

XDATA, para qué sirve y cómo funciona ( Por Favor ) !!

Publicado por duke (13 intervenciones) el 04/05/2024 08:45:12
Hola Gerardo, magnífica tu descripción y la manera de explicarme ‼‼
Estuve viendo lo de crear los círculos y con el comando escrito que me recomendaste, XDLIST, puede ver internamente el xdata
me aparece esto:
* Registered Application Name: EjemploDuke
* Code 1071, 32-bit signed long integer: 4
Siendo el número 4 el cuarto círculo que pude crear
Y efectivamente se pudo crear la polilinea en el orden en que fueron creados.
Estaré estudiando el código para lograr comprenderlo a profundidad y trataré de hacerle modificaciones, para hacer (talvez) otras cosas, ja ja ja, eso espero.
Te vendré a pedir ayuda cualquier cosa.
Y muchísimas gracias por tu valioso aporte Gerardo ‼‼‼
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 1.285
Oro
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

XDATA, para qué sirve y cómo funciona ( Por Favor ) !!

Publicado por Gerardo (997 intervenciones) el 04/05/2024 19:05:18
con gusto.

Es bueno que en este foro se consulte sobre programación, que para eso es, y no solo sobre temas de usuario
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de duke

XDATA, para qué sirve y cómo funciona ( Por Favor ) !!

Publicado por duke (13 intervenciones) el 08/05/2024 06:49:13
Hola de nuevo Gerardo.
Crees que puedas ayudarme con ésto por favor ?
Ejemplo:
Con código ir creando textos con cifras numéricas
1) 10
2) 8.4
3) 3.6
4) 12
5) 9.5

Y que internamente con XDATA cada uno contenga un identificador del 1 al 5, tal y como los numeré antes
Y que luego se pueda elegir cuáles sumar de esta manera:

Sumar del 2 al 4, digitando el 2 como inicio y el 4 como final
o si no
Sumar del 3 al 5, digitando el 3 como inicio y el 5 como final
O en fin, los que uno quiera elegir, siempre consecutivos

Eso es posible con XDATA ??

Gracias amigo !!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 1.285
Oro
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

XDATA, para qué sirve y cómo funciona ( Por Favor ) !!

Publicado por Gerardo (997 intervenciones) el 10/05/2024 03:42:35
Hola

claro, con gusto. Te ayudo para que lo vayas haciendo vos mismo y aprendas

Comencemos con la creación de los textos
¿Como creas textos con autolisp?
Con (vla-addtext ...
con (entmake ((0 . "TEXT") ....
o con (Command "_Text" .... )
?

Las dos primeras formas sé que se les puede agregar la xdata, la tercera forma yo no la uso nunca pero creo que igual es posible agregarle xdata con el comando xdata de las express tools.

Así que te propongo que intentes creando una función que crea los textos pidiéndole los valores al usuario, y coloques por aqui el código para verlo.

Y entonces te ayudo primero a revisarlo por si se le puede corregir o mejorar algo, y desde luego que a agregarle lo del xdata según el tipo de programación que uses

Te parece?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de duke

XDATA, para qué sirve y cómo funciona ( Por Favor ) !!

Publicado por duke (13 intervenciones) el 10/05/2024 07:48:26
Hola Gerardo, muchas gracias por tu respuesta !
Aquí está el Código solicitado, sinceramente no sabía como hacer un texto con vla-addtext.
Pero indagué y logré aprender a hacerlo de esa forma, algo diferente a (Command "_Text"
Quedo a la espera de tu valiosa ayuda !!!

1
2
3
4
5
6
7
;@@@@@@@@@@@@@@@@    CREAR TEXTO CON vla-AddText     @@@@@@@@@@@@@@@@
(defun c:aa ()  (vl-load-com)
  (setq ESPACIO-MODELO (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
  (setq TEXTO-1 (getstring T " \n Digita el Texto : ")) (setq ALTURA-TEXTO (getreal " \n Digita la ALtura del Texto: "))
     (setq TEXTO-2 (vla-AddText ESPACIO-MODELO TEXTO-1 (vlax-3d-point (getpoint "\n Pica un Punto para colocar el texto: ")) ALTURA-TEXTO))
     (princ)
)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 1.285
Oro
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

XDATA, para qué sirve y cómo funciona ( Por Favor ) !!

Publicado por Gerardo (997 intervenciones) el 10/05/2024 18:47:53
Bien, perfecto. Entonces nos vamos con el modo ActiveX

La primera pregunta que me nace es como se van a crear esos textos, si en llamadas separadas o pueden ser varios textos en una sola llamada. Eso solo tu lo sabes, depende del uso que le vayas a dar a la rutina. Es decir, si después de cierto cálculo o proceso creas un texto y ya, hasta que hagas otros cálculos o procesos crearás otro, pues como lo tienes está bien, invocas al comando aa, digitas el texto, la altura, picas el punto y terminamos por ahora.... pero si puedes crear más de un texto en una sola llamada de la rutina entonces es mejor meterlo en un bucle que haga:

mientras el usuario indique un texto...
crear una entidad tipo texto...

así el mismo comando aa te peritirá crear varios hasta que le indiquemos terminar o hasta que ya no digitemos un texto.

Entonces, te sirve más así a como está o prefieres meterlo en un bucle que permita crear un texto diferente en cada ciclo?


Y la segunda pregunta es: puedes crear varios textos con alturas diferentes como para que cada vez el usuario tenga que estar digitando la altura de nuevo, o puede ser que establezcamos una que afecte a varios textos de una sola vez para que si varios llevan la misma altura no tengas que digitarla una y otra vez?

Y ahora dos recomendaciones iniciales.
1-El (vl-load-com) posiblemente ni sea necesario porque ahora autocad carga siempre las funciones vlax- desde que inicia, pero en todo caso conviene dejarlo, pero que se ejecute una sola vez. Si lo tienes dentro del defun, cada vez que llamas al comando aa se vuelve a ejecutar esa carga y es innecesario, así que es mejor si lo ponemos antes de cualquier defun

(vl-load-com)
(defun c:aa ()
...

2-Si los textos que vas a crear siempre contienen cantidades, es mejor que se los pidas al usuario con getreal, que es para pedir cantidades que con getstring que es para pedir cadenas de texto. Eso porque se controlan más los errores, si el usuario se equivoca y pone "20.5a" tu función actual lo aceptará para crear el texto y luego cuando quieras sumar eso habrá un fallo. Pero si le pedimos directamente un valor y lo digitado no lo es, ahí mismo el propio autocad le alertará al usuario que lo digitado no es numérico.
Así que si solo vas a trabajar con cantidades te recomiendo cambiar el
(getstring T " \n Digita el Texto : ")
por
(getreal " \nDigita el valor:")

y claro, lo devuelto por getreal no es un texto, sino un valor numérico, por lo que para que sea texto se debe convertir con "distof" o con "atof"

(distof (getreal " \nDigita el valor:") )

Responde las preguntas y fijate si te sirven esas recomendaciones y luego vamos a lo que sigue
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de duke

XDATA, para qué sirve y cómo funciona ( Por Favor ) !!

Publicado por duke (13 intervenciones) el 10/05/2024 19:11:02
perfecto Gerardo, muy amable por la paciencia
ya lo leí y te explico
La idea es sumar las distancias que uno le indique, en este caso son distancias frente a un acceso.
Te adjunto una imagen para darme a explicar
Gracias !!

bbbbbbbbbbbbbbbb
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 1.285
Oro
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

XDATA, para qué sirve y cómo funciona ( Por Favor ) !!

Publicado por Gerardo (997 intervenciones) el 10/05/2024 20:39:28
mmm.... lo que no entiendo es el papel de la xdata aqui.

Primero, porque como te dije es una programación más avanzada
Segundo porque tendrías que hacer como usuario unos pasos adicionales para ir guardando la xdata en cada número

Y si ya tienes el derrotero o tabla de construcción ¿porque no tomar y sumar los textos del derrotero en vez de guardarlos en xdata?, o si no tienes aún el derrotero pero tienes el polígono ¿porque no medirlo en el polígono?

No sé si nos estamos entendiendo bien, es que de todos modos para crear la xdata tendrías de alguna forma que seleccionar los textos de los vértices y los lados a medir como mínimo para colocar los datos.... y siempre es más facil como usuario seleccionar las distancias en la tabla de derrotero, que posiblemente sean textos continuos y puedes seleccionar de una con una ventana... (o si no hay derrotero pero tienes la polilínea, es solo seleccionar la polilínea, y el punto inicial y final...)


Te invito a replantearte lo que deseas. Si quieres aprender xdata, pues te ayudo con gusto igual, me parece que te falta antes aprender muchas otras cosas de programación para llegar a eso, pero te ayudo y hay buenos manuales

Pero si lo que quieres es resolver problemas puntuales como el que me planteas, debe haber una forma mucho más sencilla y eficiente.

Quizás este video te ayude un poco a visualizar el beneficio de la xdata, para poder decidir cuando vale la pena liarse con eso.

Ahí hay 3 rutinas.

La primera que hace tablas de construcción toma todos los datos de los polígonos. No usa xdata, porque al seleccionar el usuario el polígono en ese momento se tiene acceso a toda la geometría y se sabe internamente como se está numerando cada vértice.

La segunda que está por ahí del minuto 2:02 si usa xdata, para vincular los polígonos de los lotes con su número de lote. Eso porque cuando en el paso posterior le pedimos la lista de áreas se requiere que cada lote sepa que número de lote es, y ya la rutina que numero corrió y terminó antes. Pero el usuario nunca tiene que ir vinculando cada lote con su número, eso se hace en automático al crear la numeración. Si no existiera ese vínculo al numerar mejor hacerlo como en la tercera rutina

La tercera (min 4:10) toma lotes ya numerados así que ahí no hay xdata (aunque luego hice una versión mejorada que si crea ese vínculo con xdata) Lo que si usa la tercera es un diccionario que es la otra forma que te dije en la primera respuesta, para almacenar datos en el dibujo que luego son extraídos cada vez que se crea un plano para llenar los pies de hoja o cajetines. Pero eso queda como atributos así que en otras rutinas que utilizan esos datos lo que hacemos es consultar los atributos.

https://youtu.be/EF5qTviiVII

Así que básicamente cuando uso xdata? Pues cuando debo preservar datos que no son parte de la geometría o propiedades de las entidades, vinculados a las mismas, y que quizás no puedo obtener luego analiando las mismas o me ahorran el trabajo de irlas seleccionando o inspeccionando, y por lo mismo ojalá que sean datos que pueda vincular en automático con la misma rutina con la que dibujé, y no que hay un procedimiento de solo ir metiendo la xdata a los objetos, porque eso en los casos comunes no ahorra mucho trabajo comparado con el trabajo que lleva programar una buena rutina

Antes de usar xdata siempre valoro si será más fácil usar atributos, variables de ambito global (si los siguientes pasos se harán en la misma sesión de dibujo) o recalcular la información en tiempo de ejecución de la rutina que ocupa los datos o simplemente dejar todo lo posible listo (por ejemplo en tu caso si tienes una rutina que hace derroteros modificarla para que de una vez al crear la tabla le digas de donde a donde es el frente y de una vez calcule esa longitud y te la deje anotada por ahí)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de duke

XDATA, para qué sirve y cómo funciona ( Por Favor ) !!

Publicado por duke (13 intervenciones) el 10/05/2024 23:18:40
Hola de nuevo gerardo.
Bueno, la verdad que por ahora lo que me interesa es sumar los frentes al acceso.
Quiere decir que puedo decirle a la rutina
- los vertices de dónde a dónde
- toco la poly
- averiguo las coordenadas de cada punto
- y saco las distancias entre cada vértice
- y las sumo
es asi ?
_______________________
Lo que no quiero es tner q hacer una ventana, en ocasiones son muchos puntos y lo más simple es digitar, por ejemplo
del 1 al 64 y tocar la poly
voy a intentarlo
Gracias por la idea !!
Ahora regreso !
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 1.285
Oro
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

XDATA, para qué sirve y cómo funciona ( Por Favor ) !!

Publicado por Gerardo (997 intervenciones) el 11/05/2024 16:33:06
En caso de que no tengas la tabla de construcción si, por ahí va el asunto, solo que no tienes que averiguar coordenadas, hay funciones para medir sobre polilineas entre dos puntos.

Insisto en lo de la tabla, si la tienes lo más fácil siempre es sumar los textos de la tabla del derrotero, primero porque seleccionar textos, obtener su contenido literal, quitarles el sufijo "m" y sumarlos es una programación supersencilla en lisp, y segundo por el tema del redondeo (te lo aclaro luego)

Si quieres medir sobre la polilinea te dejo unas ideas.

No sé donde consultas lisp, si tienes un manual o usas la misma ayuda del autocad (es lo que yo mas uso, con los ejemplos que vienen ahi suele ser suficiente para comprender cada función), pero donde sea que consultas sobre autolisp echale un vistazo a estas dos funcones:

vlax-curve-getparamatpoint
vlax-curve-getdistatparam


El parámetro es un número que representa el avance a lo largo de una polilínea. Por ejemplo el tercer vértice tiene el parámetro 3.0 y el cuarto vértice tiene el parámetro 4.0, y el punto medio del segmento que los une tiene parámetro 4.5 (sin importar la longitud de ese segmento, el .5 se refiere a que es la mitad)

Luego vlax-curve-getdistatparam te da la distancia desde el inicio de la polilínea hasta un parámetro que indiques

Entonces si obtienes el parámetro de tu vertice incial y el de tu vertice final del frente del lote (con getparamatpoint), sacas la distancia a cada parámetro y restas el primero del segundo y ahi tienes tu frente

Por ejemplo, si quieres saber la distancia entre el cuarto y el séptimo vértice de cualquier polilínea (que tenga al menos 7 vértices lógicamente), este código lo hace:

1
2
3
4
5
6
(setq objetopoly (vlax-ename->vla-object (car (entsel "Polilinea: ")))
      frente (-
                (vlax-curve-getdistatparam objetopoly 6.0)
                (vlax-curve-getdistatparam objetopoly 3.0)
             )
)

Tres aclaraciones:
1-Fijate que el cuarto vértice tiene parámetro 3.0 y el séptimo parámetro 6.0, eso porque el primero es lógicamente 0.0. Aunque eso no te importa cuando los vértices son seleccionados, porque tu simplemente le dices al cad "desde el parametro de este vertice hasta el parámetro de este otro vértice"

2-No siempre será tan simple como una sola resta. Depende del sentido en que esté dibujada la polilínea (si seleccionas primero el más alto y luego el menor la distancia te da negativa) y si el vértice inicial de la misma está a medio camino entre los dos que estás midiendo pues debes sacar dos distancias y sumarlas: desde el inicio de medición hasta el final de la poly y desde el inicio de la misma hasta el final de mediciín, pero aún así sigue siendo algo muy sencillo de programar

3- A veces las coordenadas devueltas por "getpoint" y tocando un vértice de una polilinea, no son necesariamente las mismas con toda la presición que tiene guardadas el autocad como vértice, y aunque la diferencia sea 0.00000000000000001 y eso no afecte tu cálculo, si que puede dar error porque es suficiente para que vlax-curve-getparamatpoint diga que el punto no pertenece al trazo de la poly. Para arreglar eso yo uso vlax-curve-getClosestPointTo que devuelve el punto más cercano a un punto que si está sobre el trazo de la polilinea.
Entonces en vez de poner
1
(vlax-curve-getparamatpoint objetopoly (getpoint))
pongo
1
(vlax-curve-getparamatpoint objetopoly (vlax-curve-getClosestPointTo objetopoly (getpoint)))
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 1.285
Oro
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

XDATA, para qué sirve y cómo funciona ( Por Favor ) !!

Publicado por Gerardo (997 intervenciones) el 11/05/2024 16:58:10
Ahora... te decía que sumar los textos en la tabla es mucho más fácil.

Es más aquí te dejo el código, mira lo sencillo que es:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
(defun c:test ( / i ss literal valores)
	(if
		(setq i 0
				;seleccionar los textos
				ss (ssget '((0 . "TEXT")))
		)
		(progn
			(repeat (sslength ss)
				;obtener la cadena de texto
				(setq literal (cdr (assoc 1 (entget (ssname ss i))))
						i (1+ i)
						;agregar el texto convertido a valor a lista de
						;valores (quitandole antes el posible sufijo "m")
						valores (cons
									  (distof (vl-string-right-trim "m" literal))
									  valores
								)
				)
			)
			(alert
				(strcat
					"Sumatoria: "
					;sumar los valores de la lista
					(rtos (apply '+ valores) 2 2)
				)
			)
		)
	)
)

Pero hay una posible complicación más que te ahorras sumando de la tabla. En mi país, y supongo que en muchos otros, los revisores del catastro miran la concordancia entre el frente que indicas y la tabla de construcción.
Supongamos que tienes dos segmentos de frente con longitudes 2.246 y 3.417. Al crear la tabla con dos decimales se redondeará como 2.25m y 3.42m. Si los sumas con el código que te acabo de dar o con una calculadora tendrás un frente de 5.67m

Ahora, supongamos que lo medimos sobre la polilínea. 2.246 + 3.417 = 5.663, se redondea a 5.66m. Esa diferencia de un cm aquí en Costa Rica es motivo de rechazo del plano. Así que si te encuentras con ese lío, sumando desde los textos no tendrías problemas, mientras que usando la distancia entre parámetros de las polilíneas de pronto no te serviría pedir la distancia del vértice 10 al 14, sino que tendrías que medir de 10 a 11, de 11 a 12... etc, redondear primero cada valor y luego sumarlos, para asegurarte que la distancia medida va a coincidir con la que obtienes sumando en el derrotero en la tabla
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar