;Criador: Evelina Ilie
;Professor: Luís Romão
;Modelação
;Faculdade de Arquitetura de Lisboa

;; Comando principal: criação de 1/4 de esferas 
(defun c:lazy ()
	(setq pontos2d (getvar "osmode"))
	(setq pontos3d (getvar "3dosmode"))
	(setq nu 0)
	(setvar "osmode" 0)
	(setvar "3dosmode" 0)
	(setq pt1 (getpoint "indique o ponto de inserção do pavilhão:  "))
	(command "ucs" pt1 "")
	(setq nvezes (getint "Qual o número de iglos?"))
	(command "pline" (list 12 15 0) (list 18 15 0) "a" "a" 180 (list 12 15 0) "cl")
	(command "revolve" "l" "" (list 12 15 0) (list 118 15 0) 90)
	(guardar)
	(repeat nvezes
	(transformar)
	)
	(uniao)
	(command "ucs" "")
	(setq lista nil)
	(setvar "osmode" pontos2d)
	(setvar "3dosmode" pontos3d)	
	)
	
;; As 1/4 de esferas multiplicam-se, intersectam-se e rodam a volta de um eixo
;; O nr de 1/4 de esferas que a forma terá depende do nr de iglos que inserirmos 
	(defun transformar ()
	(command "copy" "last" "" "@" "@")
	(command "scale" "last" "" (list 15 15 0) (alea 1 1.3))
	(command "rotate" "last" "" (list (alea 14 15) (alea 14 15) 0) (alea 0 360) )
	(guardar)
	)
	
;; Função para guardar entidades	
(defun guardar ()
	(setq lista (append lista (list (set (read (strcat "entidade" (rtos nu))) (entlast)))))
)

;; Função de União
(defun uniao ()
	(command "union")
    (foreach p lista (command p)) 
    (command "")
)	
	
;; Função de numeros semi-aleatórios	
(defun alea ( min max / )
	(+ min (valor (- max min)))
	)
(defun valor (num)
	(* num (rnd))
	)
(defun rnd (/ modulus multiplier increment random)
  (if (not seed)
    (setq seed (getvar "DATE"))
	)
  (setq modulus    65536
        multiplier 25173
        increment  13849
        seed  (rem (+ (* multiplier seed) increment) modulus)
        random     (/ seed modulus)
	)
)