lisp que dibuje linea y extraiga su longitud

lisp que dibuje linea y extraiga su longitud

Anonymous
No aplicable
3.440 Vistas
9 Respuestas
Mensaje 1 de 10

lisp que dibuje linea y extraiga su longitud

Anonymous
No aplicable

Buen dia.

Soy Vanessa, estudiante de arquitectura en Bolivia, quisiera pudiesen ayudarme
nesecito obtener la informacion de la longitud de ciertos elementos lineales, dandole dos puntos de referencia (inicio y fin), cada vez que se realize esta operacion se debera incrementar el numero de los datos obtenidos, por ejemplo m1 , m2, m3 luego habria que añadirle un prefijo, por ultimo estos datos deberian estar a un lado de el objeto analizadoimagen.pngimagen.png

0 Me gusta
3.441 Vistas
9 Respuestas
Respuestas (9)
Mensaje 2 de 10

Juanfranciscoangel
Mentor
Mentor

Buenas pudiste resolver el problema?

Juan Francisco Angel
¿Te resultó útil esta publicación? No dudes en darle Me gusta a esta publicación.
¿Tu pregunta fue respondida exitosamente? Luego haga clic en el botón ACEPTAR SOLUCIÓN.

EESignature

0 Me gusta
Mensaje 3 de 10

fercar66
Advocate
Advocate

@Juanfranciscoangel  perdon... cual fue la solucion????

0 Me gusta
Mensaje 4 de 10

calderg1000
Mentor
Mentor

Estimada @Anonymous 

Todo lo que solicitas, seguro se puede hacer con Autolisp; veré que acondicionar alguno de los Lisp de mediciones que uso con frecuencia y se ajuste a tu requerimientos.

Una consulta, por que requieres que que el reporte de la longitud se encuentre en FIELD; sera tal vez  que tu polilinea la vas editar posteriormente...? creo que ello complicaría un poco. Si se tratase de una linea no habría problema pero en el caso de una polilinea habria varias condicionantes previas para ello.

Saludos.


Carlos Calderon G
EESignature
>Did you find this post helpful? Feel free to Like this post.
Did your question get successfully answered? Then click on the ACCEPT SOLUTION button.

0 Me gusta
Mensaje 5 de 10

Anonymous
No aplicable

Gracias por responder y por la intencion de ayudarme. Bueno lo del field no es muy necesario, siendo sincera la verdad era solo para hacer mas espectacular la rutina, aunque me agradaria y mucho aprender como colocar un field de alguna linea o  polilinea que extraiga su longitud unicamente, agradeceria mucho su aporte

 

Bueno dandome a la tarea de estudiar y estudiar (bien duro), realice un codigo Lisp por mi misma.

 

Es mi primera rutina de la vida, asi que ahora la idea es que me enseñen a pescar, no es muy necesario que me den el pescado frito con arroz y limon (ojala se entienda la analogia), ruego que alguien pueda darse el tiempito de explicarme algunas cosillas. Primero indicare que rutina invente y luego le pedire si puede esplicarme como hacer algunas cosillas que ahora me parecen mas importantes 

 

1.- la rutina la se llama PBCV lo que hace primero es pedirte dos puntos .
2.- Luego te pide el tipo de Muro (Cualquier entero del 1 al 1000000 millones)
3.- Punto 1 y 2 de insercion del texto ( es un Mtext ) 
4.- Dibuja una pline (polilinea para los exquisitos) 

5.- Numera cada inserccion del Mtext coloca prefijo longitud de la linea y sufijo).

 

Ademas que coloca un cuadro de texto (alert) , crea un layer y un estilo de mtext. Pero quisiera pedir si alguien se compadece de mi y mis trasnoches lo siguiente : 

1.-  Como rayos hago para que el Metext se coloque automaticamente y no dandole dos puntos (pero, y si le quitas el getpiont? Claro, pero que puntos de inserrcion le indico, tengo como unas 20 opciones, pero como rayos hago que dos puntos X1 y y1 ejemplo, se trasfomen en un solo P1 como lo haria el Getpoint)
2.- De que numera numera, bueno pero cuando te sales del comando o acabas algo y reinicias despues Como hacer para que continue numerando¡? el comando While esta bien y todo pero ahora quisiera que continue numerando, aunque desactive el comando y lo haga mas tarde, o tal vez podia preguntar "/n de que numero empiezo?:"  uno le indique y fin del problema,  PERO, COMO?

3.- Pero no menos importante : la idea era exportar a excel los Mtext, de lo contrario la rutina solo es un estilo de acotacion (mejorado tal vez), esas para mi ya son palabras mayores, entonces buscando encontre una rutina que exporta los textos a un archivo cvs  y aparece en excel los datos indicados de esta manera 

vanquivar_0-1589837134015.png

No se quien hizo esta rutina, pero de todo corazon bendigo a ese buen hombre, y ahora dandome a la tarea de modificar un poco esto para mis necesidades quisiera consultar como puedo hacer para convertir eso en esto

vanquivar_1-1589837373142.png

Gracias a todos los interesados en responderme 
ADJ lisp PBVC


(defun c:pbcv ()

(alert
" \Esta rutina obtiene la longitud entre dos puntos que ud. le indiquie \n Devuelve el valor medido y los prefijos y sufijos que he generado
\n Para utizarlo teclee PBCV
\n Ingeniado por Vnquivar");Cuadro de texto que protege al lisp de otraas aplicaciones y ayuda a ordenar un poco

;Primero crea un layer llamado inf Long Muos de color amarllo, luego la pone como actual

(command "_LAYER" "MAKE" "Inf Long Muros" "color" 2 "" "")
(command "_LAYER" "_Set" "Inf Long Muros" "")


; Aqui se coloca el estilo de texto a usar

(command "-style" "PLIM" "CENTURY GOTHIC" 0.1 1 0 "NO" "NO")

; primero solicita dos puntos luego el tipo de muro

(Setq N 1)
(while
(setq p1 (getpoint "\nIngrese un punto"))
(setq p2 (getpoint "\nIngrese siguiente punto" p1))
(setq tipo (getstring T "\nIngrese tipo de muro : "))

; iniciamos extrayendo las coordenas xy de los puntos mencionados

(setq xp1 (car p1))
(setq yp1 (cadr p1))

(setq xp2 (car p2))
(setq yp2 (cadr p2))

; Operaciones aritmeticas con los puntos mencionados

(setq rx1 (- xp2 xp1))
(setq ry1 (- yp2 yp1))

(setq cx (* rx1 rx1))
(setq cy (* ry1 ry1))

(setq sum (+ cx cy))
(setq RAT (sqrt sum))

; aqui se obtienen los puntos para la insercion del mtext

(setq tp1 (getpoint "\nPunto inicial Txt: "))
(setq tp2 (getpoint "\nDPunto Final Txt: "))

(setq cad1 "Lon. ")
(setq cad2 (rtos RAT 2 2))
(setq cad3 " m.")
(setq cad4 "Muro Tipo: ")
(setq cad5 tipo)
(Setq cad6 "M ")
(Setq cad7 (itoa N))

(setq tm (STRCAT cad4 cad5))
(setq nm (STRCAT cad6 cad7))
(setq Lm (STRCAT cad1 cad2 cad3))

(setq TPAN (STRCAT "\n" nm "\n" tm "\n" lm))

(command "_mtext" tp1 tp2 TPAN "")

(command "_pline" p1 p2 "")

(SETQ N (+ 1 N))


)
)

 

Luego la rutina de algun gran maestro que exporta Mtext a excel (alguna que otra linea le he modificado) 

se llama ET


(defun LM:writecsv ( lst csv / des sep )
(if (setq des (open csv "w"))
(progn
(setq sep (cond ((vl-registry-read "HKEY_CURRENT_USER\\Control Panel\\International" "sList")) (",")))
(foreach column lst (write-line (LM:lst->csv column sep) des))
(close des)
t
)
)
)
(defun LM:lst->csv ( lst sep )
(if (cdr lst)
(strcat (LM:csv-addquotes (car lst) sep) sep (LM:lst->csv (cdr lst) sep))
(LM:csv-addquotes (car lst) sep)
)
)

(defun LM:csv-addquotes ( str sep / pos )
(cond
( (wcmatch str (strcat "*[`" sep "\"]*"))
(setq pos 0)
(while (setq pos (vl-string-position 34 str pos))
(setq str (vl-string-subst "\"\"" "\"" str pos)
pos (+ pos 2)
)
)
(strcat "\"" str "\"")
)
( str )
)
)

(defun C:ET(/ lst ss i el x fn)

 

(setq lst (list) ss (ssget (list (cons 0 "MTEXT"))) )
(repeat (setq i (sslength ss))
(setq x (ssname ss (setq i (1- i))))
(setq el (entget x))
(if (= (cdr (assoc 0 el)) "MTEXT")
(setq lst (append lst (list (list (cdr (assoc 1 el))))))
)
)
(setq fn (vl-filename-mktemp nil nil ".csv"))
(if (and lst (LM:WriteCSV (reverse lst) fn))
(startapp "explorer" fn)
)
)

 

GRACIAS

0 Me gusta
Mensaje 6 de 10

Edwin.Saez
Advisor
Advisor

@Anonymous ,

 

Veo código del Maestro "Lee Mac" 😁

Que agradable ver a una mujer programando, no se ve mucho por aquí, ni en los foros de programación Lisp.

Animo que si se puede! 💪

Edwin Saez


LinkedIn / AutoCAD Certified Professional


EESignature


 


Si mi respuesta fue una solución para usted, por favor seleccione "Aceptar Solución", para que también sirva a otro usuarios.

0 Me gusta
Mensaje 7 de 10

calderg1000
Mentor
Mentor

Estimada @Anonymous 

Veo que tienes un buen inicio, es muy cierto al inicio hay estudiar mucho y esforzarse para llegar a comprender el funcionamiento de los códigos en Lisp, pero todo ese esfuerzo seguro tendrá su recompensa.

Hice algunos cambios a tu rutina tratando de cumplir con algunos de los requisitos que solicitas, prueba su funcionamiento y me comentas.

En cuanto a la segunda parte de la rutina, seguro funciona muy bien ya que el autor Lee Mac,  es una autoridad en Autolisp.

Saludos.

 

(defun c:pbcv ()

(alert
" \Esta rutina obtiene la longitud entre dos puntos que ud. le indiquie \n Devuelve el valor medido y los prefijos y sufijos que he generado
\n Para utizarlo teclee PBCV
\n Ingeniado por Vnquivar");Cuadro de texto que protege al lisp de otraas aplicaciones y ayuda a ordenar un poco

;Primero crea un layer llamado inf Long Muos de color amarllo, luego la pone como actual

;;;(command "_LAYER" "MAKE" "Inf Long Muros" "color" 2 "" "")
;;;(command "_LAYER" "_Set" "Inf Long Muros" "")

(setvar "cmdecho" 0)
(setvar "dynmode" 3)

(command "_LAYER" "n" "Inf Long Muros" "s" "Inf Long Muros" "c" 2 "" "")

; Aqui se coloca el estilo de texto a usar

(command "-style" "PLIM" "CENTURY GOTHIC" 0 1 0 "NO" "NO")
(setq ht (getreal "\nIngrese Altura de Texto: "))
(setvar "textsize" ht)
(setvar "dimtxsty" "PLIM")
(setvar "dimtxt" ht)
(setvar "dimasz" ht)
(setvar "dimgap" (/ ht 4.0))

; primero solicita dos puntos luego el tipo de muro

;;;(Setq N 1)
(setq tipo (getstring T "\nIngrese tipo de muro : "))
(setq N (getint "\nIngrese Valor Inicial...:"))
(while
;;;(setq tipo (getstring T "\nIngrese tipo de muro : "))
(setq p1 (getpoint "\nIngrese un punto"))
(setq p2 (getpoint "\nIngrese siguiente punto" p1))
(command "_pline" p1 p2 "")
;;;(setq tipo (getstring T "\nIngrese tipo de muro : "))

; iniciamos extrayendo las coordenas xy de los puntos mencionados

;;;(setq xp1 (car p1))
;;;(setq yp1 (cadr p1))
;;;
;;;(setq xp2 (car p2))
;;;(setq yp2 (cadr p2))
;;;
;;;; Operaciones aritmeticas con los puntos mencionados
;;;
;;;(setq rx1 (- xp2 xp1))
;;;(setq ry1 (- yp2 yp1))
;;;
;;;(setq cx (* rx1 rx1))
;;;(setq cy (* ry1 ry1))
;;;
;;;(setq sum (+ cx cy))
;;;(setq RAT (sqrt sum))
;;;
(setq RAT (distance p1 p2))

; aqui se obtienen los puntos para la insercion del mtext

;;;(setq tp1 (getpoint "\nPunto inicial Txt: "))
;;;(setq tp2 (getpoint "\nDPunto Final Txt: "))

(setq cad1 "Lon. ")
(setq cad2 (rtos RAT 2 2))
(setq cad3 " m.")
(setq cad4 "Muro Tipo: ")
(setq cad5 tipo)
(Setq cad6 "M ")
(Setq cad7 (itoa N))

(setq tm (STRCAT cad4 cad5))
(setq nm (STRCAT cad6 cad7))
(setq Lm (STRCAT cad1 cad2 cad3))

(setq TPAN (STRCAT "\n" nm "\n" tm "\n" lm))

;;;(command "_mtext" tp1 tp2 TPAN "")

(setq pinserc (getpoint "\nSeñalar Pto. de Inicio de Leader...? : "))

(setvar "orthomode" 0)


(vl-cmdf "_leader" pinserc "\\" "_a" tpan "")

;;;(command "_pline" p1 p2 "")

;;;(SETQ N (+ 1 N))
(SETQ N (1+ N))

)
)


Carlos Calderon G
EESignature
>Did you find this post helpful? Feel free to Like this post.
Did your question get successfully answered? Then click on the ACCEPT SOLUTION button.

0 Me gusta
Mensaje 8 de 10

Anonymous
No aplicable

Gracias, es una muy buena idea a del "leader", como habia considerado en un principio
Hablando del codigo del maestro Lee Mac, intente "decifrar", por asi decirlo el codigo en su conjunto, sin exito aun, alguien podria hayudarme a comprender, lo agradeceria muchoo

0 Me gusta
Mensaje 9 de 10

Edwin.Saez
Advisor
Advisor

@Anonymous ,

Es apreciable tu buen entusiamo de aprender del mejor! 😄 .. considero que te va tomar de estudiar no solo Lisp, sino Visual-Lisp, que es lo que veo en el codigo de Lee Macc!

Edwin Saez


LinkedIn / AutoCAD Certified Professional


EESignature


 


Si mi respuesta fue una solución para usted, por favor seleccione "Aceptar Solución", para que también sirva a otro usuarios.

0 Me gusta
Mensaje 10 de 10

calderg1000
Mentor
Mentor

Estimada @Anonymous 

Retomando la consulta, debo decirte que el código de Lee es genial pero no es explicito, su interpretación requiere conocimiento y aplicación avanzada de las funciones que utiliza.

Bueno, con las limitaciones de mis conocimientos tratare breve mente de explicar algo de su código:

En resumen se trata de obtener los datos de un conjunto de selección conformado por (setq lst (list) ss (ssget (list (cons 0 "MTEXT"))) ); textos MTEXT. y aplicarle las subrutinas , (LM:Writecsv),(LM:lst->csv),(LM:csv-addquotes), para configurar su presentación y salida a un archivo CSV.

Como se puede ver su código no es directo o explicito pero desde luego tiene en cuenta muchas posibilidades de funcionalidad que comúnmente no lo tomamos en cuenta.

Para Iniciar te alcanzo este código que obtiene los mismos resultados para este caso y su codificacion es mas directa y sencillo de interpretar:

;;;--------------------------------------------test---------------------------------

(defun C:DTT( / lst num i selp lst ltext ltextf)
(setq lst(ssget '((0 . "*text,*mtext"))))
(If lst
(Progn
(setq num(sslength lst))
(setq i 0)
(setq filen (getfiled "Nombre del Archivo de Salida...:" "c:/Documentos/" "csv" 1))
(if (/= filen nil)
(progn
(setq filew (open filen "w"))
(repeat num
(setq selp(entget(ssname lst i)))
(setq lstp(cdr(assoc 1 selp)))
(write-line lstp filew)
(setq i(1+ i))
);Repeat
(close filew)
);Progn
);If
);Progn
);If
(setq lst nil)
(princ)
);Defun

;;;--------------------------------------end----------------------------------------

 

El reporte, sera en una columna y debido a que la configuración del Mtext de tu Lisp, contiene \n (Enter), el texto se colocara uno debajo del otro; para obtenerlo en una linea te sugiero que  le quites los \n, y en su lugar le coloques espacios  " ", de esa forma luego de abrir el archivo CSV, sera muy fácil convertirlo a columnas separados por espacios. (aplicando función de XLS: Texto en columnas con el criterio separado por espacios).

Para hacer este procedimiento en columnas desde Lisp, se tendría configurar de otra forma para luego exportarlo a un archivo XLS.

Saludos.

 

 

 

 

 

 


Carlos Calderon G
EESignature
>Did you find this post helpful? Feel free to Like this post.
Did your question get successfully answered? Then click on the ACCEPT SOLUTION button.

0 Me gusta