Cómo dividir 2 ángulos a la mitad en autolisp

jes2008 - 02/04/2008 06:14
Hola amigos latinos, miren esta imagen.


🖼️

Estamos trabajando para mostrar las imágenes del foro

Adjunto #161865



Aquí yo intento que la rutina me haga círculos en cada vértice y también los numere, la única idea que tuve para centrar cada texto con respecto a los vértices anterior y posterior fue por medio de angle y dividirlo en 2, el problema surge porque yo requiero que cada texto quede dentro de la polilinea y si se fijan bien hay textos que quedan fuera, les adjunto la rutina que es bien corta para que me aconsejen que debo añadir para tener lodos los textos dentro de la polilinea y siempre centrados, muchas gracias.
[code](defun c:a ()
(setque lwpol (entsel \nSeleccione polilínea:))
(setque lst-vert-der ()) (num-vert)
(setque z num-lst-vert-der) (setque n 0 n-resp 0) (setque punt 1).
(Repeat num-lst-vert-der.
(setque para (nth n lst-vert-der))
(command circle para 1)
(command text MC (Polar para (/(+(angle para (nth (+ n 1) lst-vert-der))
(angle para (nth (- Z 1) lst-vert-der))) 2) 3.5) 2 90 (itoa punt))
(setque punt (+ punt 1)) (setque n (1+ n))
(if (= n (- Num-lst-vert-der 1)) (final)) (if (= z num-lst-vert-der) (setque z 0))
(setque z (1+ z))
),fin repeat.
),fin defun.
(Defun final ()
(setque para (nth n lst-vert-der))
(command circle para 1)
(command text MC (Polar para (/(+(angle para (nth (- N 1) lst-vert-der))
(angle para (nth 0 lst-vert-der))) 2) 3.5) 2 90 (itoa punt))
),fin defun.
(defun num-vert ()
(setque nom-lwpol-der (car lwpol)) ;_nombre de la entidad.
(setque pnt-lwpol-der (car (cdr lwpol))) ;_punto de selección.
(setque lst-lwpol-der (entget nom-lwpol-der)) ;_lista de la entidad.
(setque dato-lwpol-der (entget nom-lwpol-der)) ;_lista de la entidad.
(setque num-vert-der (cdr (assoc 90 dato-lwpol-der))), número de vértices.
(setque dato-lwpol-der (member (assoc 10 dato-lwpol-der) dato-lwpol-der))
(setque nom-lwpol (car lwpol)) (setque lst-lwpol (entget nom-lwpol)) (setque tipo (cdr (assoc 0 lst-lwpol)))
(if (= tipo polyline)(command convert p s lwpol ))
(repeat num-vert-der.
(setque lst-vert-der (append lst-vert-der (list (cdr (assoc 10 dato-lwpol-der)))))
(setque dato-lwpol-der (cdr dato-lwpol-der))
(setque dato-lwpol-der (member (assoc 10 dato-lwpol-der) dato-lwpol-der))
(setque num-lst-vert-der (length lst-vert-der))
),fin repeat.
),fin defun[/code]

-- IMÁGENES ADJUNTAS --

🖼️

Estamos trabajando para mostrar las imágenes del foro

Adjunto #161865

3dpoder - 05/04/2023 16:41
La forma en que estás centrando el texto utilizando la función angle puede causar que algunos textos queden fuera de la polilínea. Una alternativa es usar la función midpoint para encontrar el punto medio entre dos vértices adyacentes y colocar el texto en ese punto medio. Para hacer esto, podrías reemplazar la siguiente línea de código:

[CODE](command text MC (Polar para (/(+(angle para (nth (+ n 1) lst-vert-der))
(angle para (nth (- Z 1) lst-vert-der))) 2) 3.5) 2 90 (itoa punt))[/CODE]

Con este código:

[CODE](setq pt1 para)
(setq pt2 (nth (+ n 1) lst-vert-der))
(setq midpoint (list (/ (+ (car pt1) (car pt2)) 2) (/ (+ (cadr pt1) (cadr pt2)) 2)))
(command text midpoint (itoa punt) 0.0 3.5)
[/CODE]

Esto calcula el punto medio entre los vértices pt1 y pt2 y coloca el texto en ese punto. El texto se colocará dentro de la polilínea, centrado entre los vértices adyacentes. Ten en cuenta que también he eliminado los argumentos 2 y 90 que estabas usando en la función text, ya que no son necesarios para centrar el texto.