AutoCad - Esta rutina me vuelve loco (Sustraer una region de otra)

 
Vista:
sin imagen de perfil
Val: 13
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

Esta rutina me vuelve loco (Sustraer una region de otra)

Publicado por Antonio (15 intervenciones) el 05/05/2020 00:04:26
Buenas Noches:

Intento crear una rutina, en la que todo va bien hasta que llegamos a la parte en la que quiero hacer una region que sea la diferencia de dos regiones.

No logro hacer que el lisp funcione bien. No me crea la región diferencia.

La región diferencia es una región grande a la que le quitamos una región pequeña (Como si fuera una ventana).

Adjunto dibujo de autoCAD y la Ruina en Lisp, para ver si alguien me ilumina.

Gracias por anticipado.
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

Esta rutina me vuelve loco (Sustraer una region de otra)

Publicado por Gerardo (987 intervenciones) el 05/05/2020 07:35:23
Hola
Viéndolo por encima y sin poder probarlo que ahora no estoy en el cad, veo que estás haciendo un uso errado del valor retornado por la función entsel. Porque esa función retorna una lista, que incluye además del nombre de la entidad seleccionada el punto en el que el usuario hizo click para seleccionarla.

En vez de poner
1
2
(setq Poli (entsel "\n Seleccione polilínea:"))
(command "_copy" Poli "" '(0 600 0) "" '(0 600 0))

debe ser
1
2
(setq Poli (entsel "\n Seleccione polilínea:"))
(command "_copy" (car Poli) "" '(0 600 0) "" '(0 600 0))
o puede ser
1
2
(setq Poli (car (entsel "\n Seleccione polilínea:")))
(command "_copy" Poli "" '(0 600 0) "" '(0 600 0))

Porque a como lo tienes el comando copy no copia nada y (command "region" "last" "") quien sabe que está transformando a región porque last no es la copia de la poly que pretendías



Por cierto, otra forma más simple de duplicar la polilinea es esta:
1
2
3
4
(setq hueco (car (entsel "\nSeleccione el hueco a sustaer:")))
(entmake (entget hueco))
(setq copia (entlast))
(command "region" copia "")

Con eso no estás usando copy con puntos que pueden desviarse si coinciden con un osnap (para lo cual pones el osmode=0), entonces si lo haces de esta forma no tienes que tocar para nada la variable osmode, y te quitas la posibilidad de que el usuario salga a media rutina con escape y te deje los osnaps apagados, lo cual es muy molesto para el usuario.
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: 13
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

Esta rutina me vuelve loco (Sustraer una region de otra)

Publicado por Antonio (15 intervenciones) el 06/05/2020 23:27:09
Ante todo Gerardo gracias por contestar.

Por lo que he visto en el foro, controlas bastante del tema y ayudas a mucha gente.

Agradecerte de antemano la molestia en haber visto mi rutina.... que mas que un pequeño programa en Lisp... a mi me parece una Macromal escrita...


Con tu contestación, aún me he liado mas:

Te detallo lo que yo quiero conseguir....

Esto es el principio de un programa mas extenso en Lisp, que ya tengo escrito.

- Yo parto siempre de dibujar una Polinea exterior que es el contorno de un panel de hormigón.
-A veces esa polilinea o panel, tiene en su interior huecos de puertas o de ventanas (o huecos para contadores de luz, agua, etc...)

- Lo primero que hago es una copia de esa polilinea para que me quede el contorno y los huecos para los planos que necesito sacar después para el taller de ferralla.

-Lo que necesito es seleccionar esa polilinea exterior, luego la interior que es el hueco a restar... que eso me lo convierta en region, para poder convertirlo a solido con un grosor que ya me pide la rutina....

-Etc... la rutina que tengo escrita hasta ahora solo me pide la polilinea exterior y me calcula un panel macizo (necesito que me saque el centroide o centro de gravedad de todos esos paneles... pero toda esa parte ya la tengo escrita...
La rutina me falla en la resta de la region pequeña, de la region grande. Algo estoy haciendo mal.

-Ahora solo quiero que me procese paneles con huecos... al principio he pensado en un solo hueco...pero cuando sepa restar un solo hueco... tengo que implementar un bucle o algo así, que procese todos los huecos que pueda tener el panel

No se si alguien puede ayudarme.

Gracias de todas forma por vuestro tiempo. He mirado muchos ejemplo por la red, pero no hay nada que se le parezca.
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

Esta rutina me vuelve loco (Sustraer una region de otra)

Publicado por Gerardo (987 intervenciones) el 07/05/2020 06:13:34
Pero la solucion es el CAR que te indiqué. O no?

Yo siempre trato de escribir muy didactico para ayudar a la comprensión y que la solución te sirva en muchos casos, en vez de solo decirte:
cambia el (setq Poli (entsel por (setq Poli (car (entsel (porque así arreglamos esta pero te vuelves a enredar la proxima vez que uses entsel)

La explicación:
Si tu escribes en linea de comandos o en la consola
(entsel)
y das intro y seleccionas una polilinea o cualquier entidad, te retornará algo como esto:
(<Entity name: 3d99b4a0> (1262.17 40.0385 0.0))
donde lo primero es el nombre de la entidad y lo otro el punto donde picamos para seleccionar

Cuando invocas al comando copy debes indicar cual es la entidad a copiar
(command copy ALGO...
ahí ALGO debe ser de la forma
<Entity name: 3d99b4a0>
pero tu le estás pasando a copy esta lista que no es lo mismo
(<Entity name: 3d99b4a0> (1262.17 40.0385 0.0))

El CAR (o sea, el primer elemento de )
(<Entity name: 3d99b4a0> (1262.17 40.0385 0.0))
es
<Entity name: 3d99b4a0>

Eso es lo que le debes pasar al comando copy

Luego el comando Region posiblemente falla porque cuando dices last, no sabes lo que es last, porque copy no creó nada nuevo, pero una vez que corrijas lo que significa Poli en el copy, estarás seguro que lo ultimo creado fue una polilinea y cuando le digas "last" a Region será esa la polilínea que se convierta
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: 13
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

Esta rutina me vuelve loco (Sustraer una region de otra)

Publicado por Antonio (15 intervenciones) el 09/05/2020 13:40:55
Gracias Gerardo:

- Voy haciendo avances. Ya he conseguido otra parte que queria que era que autocad crease una región de la diferencia del Contorno_Panel menos Hueco_Quitar.

Estas entidades despues de procesadas, pasan a llamarse Uno para el controno del panel y Dos para el Hueco a quitar.


¿Como puedo hacer ahora el Extrude a la region que he creado, sin tener que volver a seleccionarla mediante el ratón o el teclado?

Me explico es secuencial: El comando crea la region... la region creada pasa a llamarse Region_Creada.... y se conierta a solido sin tener que seleccionar manualmente la region...

Publico los cambios:



(defun c:RestaRegiones (/ Grosor Grosor2 Osmode_Ant Layer_Ant cmdant
Lista Balancin A Contorno_Panel Hueco_Quitar Region_Creada Uno Dos)

; Nunca se olvide de la siguiente instruccion cuando use funciones de la API extendida de LISP

(vl-load-com)

(setq cmdant (getvar "cmdecho"))

(setvar "cmdecho" 0)

(setvar "osmode" 55)

(setq Osmode_Ant (getvar "osmode"))

(setvar "osmode" 0)

(setq Layer_Ant (getvar "clayer")) ;;;Desde aqui añadido de la rutina nº 1=======================================================

(command "_-Layer" "_on" "Solidos" "" "") ;;;Muestra la capa Solidos, por si ya estuviese procesada la Polilinea.

(setq Contorno_Panel (car (entsel "\nSeleccione el contorno del panel Mierda:")))

(command "_copy" Contorno_panel "" '(0 600 0) "" '(0 600 0))

(command "_Region" Contorno_Panel "") ;;;;Convierte el contorno Poli a Region

(Setq Uno (entlast))

(command "_Chprop" Uno "" "_Color" "3" "") ;;Cambia el color del contorno del panel a rojo


;;;=========================================================
;;;
;;; Parte del programa donde se pide los huecos a sustraer
;;;
;;;=========================================================


(setq Hueco_Quitar (car (entsel "\nSeleccione el hueco a sustaer:")))

(command "_copy" Hueco_Quitar "" '(0 600 0) "" '(0 600 0)) ;;;;; Copia el hueco a sustraer para que quede para el plano del final

(command "_Region" Hueco_Quitar "") ;;;;Convierte el Hueco seleccionado a Region.

(Setq Dos (entlast))

(command "_Chprop" Dos "" "_Color" "3" "") ;;Cambia el color del hueco a quitar del panel a magenta


;;;==============================================================
;;;
;;; Parte del programa donde se supone que sustrae las regiones
;;;
;;;==============================================================


(command "_subtract" Uno "" Dos "") ;;;;Crea una region sustrayendo el hueco seleccionado del contorno del panel

(Setq Region_Creada "_last")

(princ "\n PASO POR LA RESTA Y no dio error") ;;;; Lineas de comprobacion de que el programa paso por aqui sin error.

(setq Grosor_Panel (getreal "\n Que Grosor va a tener el panel en Cm?: "))

(command "_layer" "_Make" "Solidos" "_Color" "3" "Solidos" "")

(command "_extrude" Region_Creada "" Grosor_Panel "")

(command "_Chprop" "_last" "" "_Color" "3" "")

(command "_Layer" "_set" "0" "") ;;;Pone como actual la capa cero *************************************************************





;;;============================================================================
;;;
;;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;;;
;;;============================================================================


;;;;poniendo variables como estaban

(setvar "cmdecho" cmdant)
(setvar "osmode" Osmode_Ant)
(setvar "clayer" Layer_Ant)

(setvar "pdmode" 2)
(setvar "pdsize" 10)

(setvar "cursorsize" 3)
(setvar "pickbox" 7)


); defun

Gracias por tu tiempo
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

Esta rutina me vuelve loco (Sustraer una region de otra)

Publicado por Gerardo (987 intervenciones) el 10/05/2020 02:09:16
Hola

En este caso no debes capturar la región creada, ya la tienes en DOS. Cuando Autocad junta entidades, por ejemplo en el comando join, union... la entidad que se modifica y preserva es la primera que seleccionas. Así al aplicar subtract de UNO a DOS, uno desaparece y dos se mantiene modificada.

O sea, que lo único que le falta a tu código para funcionar es, ya sea, esto:
1
2
;;; --> quita esto (Setq Region_Creada "_last")
(command "_extrude" Dos "" Grosor_Panel "")

o bien,esto:

1
2
(Setq Region_Creada Dos)
(command "_extrude" Region_Creada "" Grosor_Panel "")
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

Esta rutina me vuelve loco (Sustraer una region de otra)

Publicado por Gerardo (987 intervenciones) el 10/05/2020 02:37:14
Rizando el rizo.
Hay cosas sobrantes en tu código, como asignar algunas variables, cambiar el color a las regiones que despues van a desaparecer. Incluso en vez de capturar las copias de las polilineas, como las copias son identicas a las originales, mejor sigues trabajando sobre las que seleccionaste y le dejas al usuario las copias (no se va a dar cuenta que se las cambiaste XD ) Así te deshaces de las variables uno y dos
Fijate en este código. Es lo mismo pero resumido

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(defun c:RestaRegiones (/ Contorno_Panel	Hueco_Quitar Grosor_Panel)
 
	;Seleccionar el usuario el exterior, el hueco y el espesor
	(setq	Contorno_Panel (car (entsel "\nContorno del panel:"))
			Hueco_Quitar (car (entsel "\nHueco a sustaer:"))
			Grosor_Panel (getdist "\nGrosor del panel:")
	)
 
	;duplicar con copy lo seleccionado
	(command "_copy" Contorno_panel Hueco_quitar "" "_non" '(0 0 0) "_non" '(0 0 0) ""
	;Hacer las regiones y extruir los polígonos
				"region"  Contorno_panel ""
	)
	(setq Contorno_panel (entlast))
	(command "region"  Hueco_Quitar "")
	(setq Hueco_Quitar (entlast))
	(command "_subtract" Contorno_panel "" Hueco_Quitar ""
				"_extrude" Contorno_panel "" Grosor_Panel
	;asignar color y capa al sólido
				"_layer" "on" "Solidos" ""
				"_Chprop" (entlast) "" "_Color" "3" "_Layer" "Solidos" ""
	)
)	; defun

Eso es porque cuando tengas que seguir agregando funcionalidad es más facil comprender y modificar algo así corto que un código muy largo. Por ejemplo si vas a agregar que la placa pueda tener varios huecos, solo hay que ir a la parte donde se selecciona el hueco y ampliar eso a una selección y lista de entidades. Luego vas a la parte de sustraer y ahí trabajas el bucle de captura de regiones para sustraerlas como un todo. Como hacerlo es toda otra historia, pero modificar este codigo agregando esas funcionalidades será más claro o comprensible.
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: 13
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

Esta rutina me vuelve loco (Sustraer una region de otra)

Publicado por Antonio (15 intervenciones) el 10/05/2020 12:54:39
Hola de nuevo Gerardo:

Ante todo gracias de nuevo.

Ayer sábado por la tarde, después de la nueva consulta al foro y cuando ya era capaz de que me transformase caí en la cuenta de que la entidad REGIÓN se transformaba y solo podía llamarse Uno o Dos...

Implementé el código y ya conseguí que trabajara... Luego lo añadí al resto de la rutina en la que estaba trabajando y tuve que hacer pequeñas correcciones hasta que conseguí que funcionara bien...

Solo iba mal porque había cambiado al principio algunos nombres de variables... para que fueran mas representativos....
Como por ejemplo Poli... paso a llamarse Contorno_Panel.... de cara a modificaciones futuras es mas facil...

Pero cuando lo conseguí, se me había hecho muy tarde y no pude subir los avances, aquí al foro.

Esta claro que había muchas cosas que sobraban como cambio de colores y demás a polinesias o regiones... siemplemente eran como puntos de control que programé... para ver que la rutina al correr, pasaba por esas lineas y actuaba sobre las entidades que tenia que actuar y no sobre otras... Yo no sabia otra forma de hacerlo (Que seguro que la habrá). Trazabilidad de la ejecución del programa....(para ver por que lineas pasa....

La rutina es para mi, no es para nadie.... tengo una empresa de prefabricados de hormigón y hacemos paneles de hormigón de gran formato... (4000, 5000, 8000 kilos) y en los que hay que saber a ciencia cierta donde poner los enganches de elevación para sacarlos de los moldes donde se fabrican y que salgan de estos moldes rectos y no se tuerzan por diferencia de peso entre los dos enganches.

Cuando los paneles son ciegos (Sin Huecos), no hay problemas, pero en cuanto tienen huecos descentrados... nos vuelven locos.
Hay veces que existen varios huecos y no siempre son huecos regulares, otras veces son huecos redondos , etc...

Muchas gracias de verdad.... Me has dado otros puntos de vista... y sobre todo con el ultimo mensaje he pasado de lo que a mi me parecía una macro mal escrita.... a lo que ya parece un programa un poco mas profesional.

Por ejemplo no sabia que se podian agrupar así:

(command "_copy" Contorno_panel Hueco_quitar "" "_non" '(0 0 0) "_non" '(0 0 0) ""

las funciones de los comandos, siempre que el origen y el destino de las coordenadas coincidan para los elementos a copiar o a transformar.

Este código en mucho mas rápido y depurado.

Lastima que estemos tan lejos... Yo estoy en España...

Agradecido y seguiré, si no te importa haciendo consultas por aquí, para mejorar mi rutina... que una vez que se pone uno le pica el gusanillo y quiere ver hasta donde es capaz....

Si te puedo ayudar en algo... dímelo... valorándote bien en las respuestas o en lo que sea... soy muy nuevo en este foro y no se muy bien como funciona.

Un saludo desde España. GRACIAS.
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: 13
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

Esta rutina me vuelve loco (Sustraer una region de otra)

Publicado por Antonio (15 intervenciones) el 10/05/2020 14:45:53
A esto es a lo que me refiero....

Encima existen paneles de varios grosores y la rutina me viene muy bien para calcular aparte de los centros de gravedad de la pieza... los pesos y el volumen de m3. de hormigón.

El peso es necesario para saber la grúa necesaria para moverlos y colocarlos en obra (y la cantidad de paneles que puede llevar un camión por peso)...

Y el volumen, es necesario para saber los m3. de hormigón que hay que comprar o fabricar... para rellenarlos.
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