Página 1 de 1

Rutina para calculo y dibujo de escaleras

Publicado: Vie May 02, 2008 7:23 pm
por elhombredelsaco
Hola de nuevo a todos.
Aqui os dejo la rutina en la que he estado trabajando los ultimos dias.
Se trata de una herramienta para trazar (y calcular) escaleras según la teoria de Rondelet.
La cuestión es que aparqué la construcción hace ya unos años, pero el otro dia me surgió la necesidad de trazar unas escaleras en alzado y
ninguna de las rutinas que encontré en la red realizaba el calculo (se limitaban a solicitar el numero de peldaños y la longitud de la huella).
De manera que con el gusano en el cuerpo me puse manos a la obra, y me ha salido esto:

Código: Seleccionar todo

;;; 
;;;   _ESCALERA.lsp 
;;;    
;;;   Por PABLO_FERRER. 
;;;--------------------------------------------------------------------------------------------------------------------------- 
;;;   Permite el dibujo de escaleras según la teoría de Rondelet: 
;;;   (2ch + 1h = 62-65cm - aproximandose a 63cm) 
;;;   las huellas han de tener más de 27cm 
;;;   las contrahuellas han de encontrarse entre 15 y 18cm, no pudiendo superarse los 18,5cm 
;;;   La herramienta ha sido modificada para que la entrada de las unidades sea en centimetros 
;;;   Queda pendiente de mejora: 
;;;   -- 
;;;--------------------------------------------------------------------------------------------------------------------------- 
;;; 
;;;   Fecha de creación: 28-04-08 
;;;   Ultima modificación: 02-05-08 
;;;   V. 0.3 
;;; 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
(defun c:escalera (/ refen arranque altura sentido accion fijar peldaños contrahuella +1peldaño huella P1 P2) 
(command "_.undo" "_begin") 
(setq refen (getvar "osmode")) 
;Entrada de datos 
(setq arranque (getpoint "Idique punto de arranque de la escalera: ")) 
(terpri) 
(Initget "Altura") 
(setq 
  altura (if (=   (setq altura (getpoint 
                "Indique altura de desambarco de la escalera o [Altura]: " 
              ) 
      ) 
      "Altura" 
        ) 
      (getreal "Indique la altura: ") 
      altura 
    ) 
) 
(if (= (listp altura) t) 
  (setq altura (-  (nth 1 altura) (nth 1 arranque))) 
) 
(terpri)        
(initget "Izquierda Derecha") 
(setq 
  sentido (progn 
       (setq 
         sentido 
          (getkword 
       "Indique el sentido de la escalera Izquierda ó Derecha <Derecha>:" 
          ) 
       ) 
       (cond 
         ((= sentido "Izquierda") 1) 
         ((= sentido "Derecha") 2) 
         ((= sentido nil) 2) 
       ) 
     ) 
) 
; calculos 
(setq accion nil fijar nil +1peldaño nil) 
(while (/= accion 0) 
  (setq   peldaños (if (= accion 1) 
         (1+ (1+ (fix (/ altura 0.18)))) 
         (1+ (fix (/ altura 0.18))) 
       ) 
  ) 
  (setq contrahuella (/ altura peldaños)) 
  (setq   huella (if (= fijar t) 
       huella 
       (RoundToNearest (- 0.63 (* 2 contrahuella)) 0.005) 
          ) 
  ) 
  (if (or (> (+ (* 2 contrahuella) huella) 0.65) 
        (<2> "AutoLISP" -> "Cargar aplicación..." -> "Contenido..." -> "Añadir" ,
y buscais la aplicacion ARX de DosLIB que corresponda a vuestra versión de autocad y
sistema de procesador (en mi caso y para la 08 y 32 bits DOSLib17.arx) 
Por otra parte quiero agradecer a José Luis García el cuelgue de su función RoundToNearest,
sin la cual en esta rutina las huellas no quedarian tan "limpias". 
Un saludo a todos, y espero que os sirva y le deis un uso más intensivo del que yo le daré.

Publicado: Vie May 02, 2008 7:25 pm
por elhombredelsaco
Parece que la pagina no va muy bien del todo, aquí lo intentaré de nuevo

Código: Seleccionar todo

;;; 
;;;   _ESCALERA.lsp 
;;;    
;;;   Por PABLO_FERRER. 
;;;--------------------------------------------------------------------------------------------------------------------------- 
;;;   Permite el dibujo de escaleras según la teoría de Rondelet: 
;;;   (2ch + 1h = 62-65cm - aproximandose a 63cm) 
;;;   las huellas han de tener más de 27cm 
;;;   las contrahuellas han de encontrarse entre 15 y 18cm, no pudiendo superarse los 18,5cm 
;;;   La herramienta ha sido modificada para que la entrada de las unidades sea en centimetros 
;;;   Queda pendiente de mejora: 
;;;   -- 
;;;--------------------------------------------------------------------------------------------------------------------------- 
;;; 
;;;   Fecha de creación: 28-04-08 
;;;   Ultima modificación: 02-05-08 
;;;   V. 0.3 
;;; 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
(defun c:escalera (/ refen arranque altura sentido accion fijar peldaños contrahuella +1peldaño huella P1 P2) 
(command "_.undo" "_begin") 
(setq refen (getvar "osmode")) 
;Entrada de datos 
(setq arranque (getpoint "Idique punto de arranque de la escalera: ")) 
(terpri) 
(Initget "Altura") 
(setq 
  altura (if (=   (setq altura (getpoint 
                "Indique altura de desambarco de la escalera o [Altura]: " 
              ) 
      ) 
      "Altura" 
        ) 
      (getreal "Indique la altura: ") 
      altura 
    ) 
) 
(if (= (listp altura) t) 
  (setq altura (-  (nth 1 altura) (nth 1 arranque))) 
) 
(terpri)        
(initget "Izquierda Derecha") 
(setq 
  sentido (progn 
       (setq 
         sentido 
          (getkword 
       "Indique el sentido de la escalera Izquierda ó Derecha <Derecha>:" 
          ) 
       ) 
       (cond 
         ((= sentido "Izquierda") 1) 
         ((= sentido "Derecha") 2) 
         ((= sentido nil) 2) 
       ) 
     ) 
) 
; calculos 
(setq accion nil fijar nil +1peldaño nil) 
(while (/= accion 0) 
  (setq   peldaños (if (= accion 1) 
         (1+ (1+ (fix (/ altura 0.18)))) 
         (1+ (fix (/ altura 0.18))) 
       ) 
  ) 
  (setq contrahuella (/ altura peldaños)) 
  (setq   huella (if (= fijar t) 
       huella 
       (RoundToNearest (- 0.63 (* 2 contrahuella)) 0.005) 
          ) 
  ) 
  (if (or (> (+ (* 2 contrahuella) huella) 0.65) 
        (< (+ (* 2 contrahuella) huella) 0.62) 
         ) 
       (Alert 
         (strcat 
      "                       ¡Atención!" 
      "\n" 
      "El modulo ascensorial resultante: " 
      (rtos (* 100 (+ (* 2 contrahuella) huella)) 2 2) 
      "cm\n" 
      "se encuentra fuera de los valores límite\n" 
      "                       (62-65cm)" 
         ) 
       ) 
     ) 
  (setq   accion 
    (dos_msgboxex 
      (strcat "OPCIONES DE GENERACION\n\n" 
         "El modulo ascensorial de la escalera ha sido fijado en: " 
         (rtos (* 100 (+ (* 2 contrahuella) huella)) 2 2) 
         "cm\n" 
         "El numero de peldaños será:         " 
         (rtos peldaños 2 0) 
         "\n" 
         "La longitud de la huella será:        " 
         (vl-princ-to-string (* 100 huella)) 
         "cm                         (27-32cm)\n" 
         "La altura de la contrahuella será:  " 
         (rtos (* 100 contrahuella) 2 3) 
         "cm                    (15-18,5cm)\n" 
         "El avance de la escalera será:      " 
         (rtos (* (1- peldaños) huella) 2 3) 
         "m" 
      ) 
      "Esclaleras" 
      (list "Aceptar" "+1 peldaño" "Resetear" "Fijar Huella") 
    ) 
  ) 
  (cond ((= accion 1) 
     (if (= +1peldaño t) 
       (alert "Ya se ha añadido un peldaño") 
       (setq +1peldaño t) 
     ) 
   ) 
        ((= accion 2) (setq accion nil fijar nil +1peldaño nil)) 
   ((= accion 3) 
     (setq   accion (if (= +1peldaño t) 
          1 
          nil 
             ) 
      fijar  t 
      huella (/ (dos_getreal 
          "Forzar huella" 
          "Indique una longitud entre 27 y 32cm" 
          1 
          30 
          32 
          27 
         ) 100 ) 
     ) 
   ) 
  ) 
) 
(setq P1 arranque) 
; dibujo 
(setvar "osmode" 0) 
(repeat peldaños 
  (setq P2 (polar P1 (/ PI 2) contrahuella)) 
  (command "_Line" P1 P2 "") 
  (setq P1 P2) 
  (if (= sentido 1) 
         (setq P2 (polar P1 pi huella)) 
         (setq P2 (polar P1 0 huella))) 
  (command "_Line" P1 P2 "") 
  (setq P1 P2) 
  (setq peldaños (1- peldaños))) 
(setvar "osmode" refen) 
(command "_.undo" "_end") 
) 

;;---------------------------  RoundToNearest ----------------------------------- 
;; Redondear Numero a Numero mas cercano; por José Luis García                    
;;------------------------------------------------------------------------------- 
(defun RoundToNearest (dblVal dblNear / dblTemp RetVal) 
 (if (not (zerop dblNear)) 
  (progn 
   (setq dblNear (* dblNear 100)) 
   (setq dblTemp (fix (/ (+ (* dblVal (expt 10 2)) (/ dblNear  2)) dblNear))) 
   (setq RetVal  (/ (* dblTemp dblNear) (expt 10 2))) 
  ) 
  (setq Retval 0) 
 ) 
 RetVal    
)

Publicado: Vie May 02, 2008 7:33 pm
por elhombredelsaco
Antes de que los que no tienen conocimientos de autolisp levanten la liebre
diré que para poder usarla teneis que tener cargadas las librerias de funciones DosLib,
las cuales os podeis bajar de la siguiente URL;
http://download.mcneel.com/download.asp?id=doslib
Son totalmente gratuitas, y una vez descargadas, colocais los archivos de extensión .ARX en la carpeta Support
(C:\Documents and Settings\XXXXX\Datos de programa\Autodesk\AutoCAD 2008\R17.1\esp\Support)
Para finalizar teneis que cargar las ARX mediante
Menú "Herr." -> "AutoLISP" -> "Cargar aplicación..." -> "Contenido..." -> "Añadir" ,
y buscais la aplicacion ARX de DosLIB que corresponda a vuestra versión de autocad y
sistema de procesador (en mi caso y para la 08 y 32 bits -> OSLib17.arx)
Reiniciais autocad, cargais _ESCALERA.lsp y a funcionar.

Por otra parte quiero agradecer a José Luis García el cuelgue de su función RoundToNearest, en HISPACAD sin la cual en esta rutina las huellas no quedarian tan "limpias".
Un saludo a todos, y espero que os sirva y le deis un uso más intensivo del que yo le daré.

Publicado: Lun May 05, 2008 10:09 am
por Afga
Muy buena el hombredelsaco. Gran aporte. Seguro que a más de uno le vendrá muy bien.

Un saludo.

Publicado: Lun May 05, 2008 1:02 pm
por suficiente
Muy bueno, yo tenia una de escaleras pero esta esta mas conseguida :lol:

Publicado: Mié May 07, 2008 12:45 pm
por Rompeteclas
Muchas gracias por tu aportación elhombredelsaco, lo he probado y es muy bueno, solo añadiría una cosa, si en vez de lineas fueran polilineas sería la caña.
Salud2

Publicado: Mié May 07, 2008 4:36 pm
por elhombredelsaco
Bueno, en principio la rutina no está terminada. Si algún dia puedo retomarla, me gustaria hacer que se le pudiera indicar si el usuario quiere escaleras de una ida, o de ida y vuelta con descansillo. entonces seria el momento de sopesar si línea o polilínea, pero insisto, eso será en otro momento. (llamesele puente sin plan por ejemplo).
Un saludo a todos.

Re: Rutina para calculo y dibujo de escaleras

Publicado: Sab Dic 12, 2015 10:51 am
por Faber
Hola elhombredelsaco, gracias por tu aplicación.

Ya sé que este post es antiguo pero si alguien me puede ayudar se lo agradezco. Quería probar la aplicación, la cargo, pero al intentar ejecutarla escribiendo _escalera se me inicia el comando de arkitool del mismo nombre ¿cómo puedo cambiarlo?