; Dominique VAQUAND
; 07.06.2011
; www.dominique-vaquand.com
; contact@dominique-vaquand.com

(defun c:AlignerFenetres ()

  (princ "*** 07.06.2011 *** contact@dominique-vaquand.com ***")

  (vl-load-com)

(princ "\nSélectionnez la fenêtre de référence: ")
  (setq ObjFenetreRef (ssget ":S" (list (cons 0 "VIEWPORT"))))
  
(if (/= ObjFenetreRef nil)
  (progn

    (setq ObjFenetreRef (ssname ObjFenetreRef 0))
  
  (princ "\nSélectionnez les autres fenêtres: ")
  (setq ObjAutesFenetres (ssget (list (cons 0 "VIEWPORT"))))

  
(ssdel ObjFenetreRef ObjAutesFenetres)

  
  (setq CentreFenetreRef (cdr (assoc 10 (entget ObjFenetreRef))))
  (setq LargeurFenetreRef (cdr (assoc 40 (entget ObjFenetreRef))))
  (setq HauteurFenetreRef (cdr (assoc 41 (entget ObjFenetreRef))))

  (initget 7 "U S G D")

  (setq ChoixPostionFenetres (getkword "Disposition des fenêtres par rapport à la fenêtre de référence [dessUs ou deSsous ou Gauche ou Droite]: "))

   (initget 7)
  (setq EcartEntreFenetres (getdist "\nEcart entre les fenêtres: "))

  (initget 7 "O N OUI NON")
  (setq choixDimensionsFenetres (getkword "\nVoulez-vous uniformiser la taille des fenêtres à la taille de la fenêtre de référence (sauf fenêtres complexes) [Oui ou Non]: "))


  (if (/= ObjAutesFenetres nil)
  (progn

    	(setq NbreAutresFenetres (sslength ObjAutesFenetres))

  

	(setq HauteurFenetreRefX HauteurFenetreRef)
        (setq LargeurFenetreRefX LargeurFenetreRef)
    	(setq CentreFenetreRefX CentreFenetreRef)



    ;; redimensionnement des fenêtres

	(setq index 0)


	 (if (= choixDimensionsFenetres "O")
	   (progn
	     (repeat NbreAutresFenetres
	     (setq VLAOBJ (vlax-ename->vla-object (ssname ObjAutesFenetres index)))
		   (vla-put-Height VLAOBJ HauteurFenetreRefX)
	     	   (vla-put-Width VLAOBJ LargeurFenetreRefX)
	            (vla-update vlaobj)
	           (setq index (1+ index))
	     )
	   )

  )


  (setq Osmode (getvar "osmode"))
  
  (setvar "osmode" 0)
    
    (cond

      ((= ChoixPostionFenetres "U") ; Dessus

       (setq index 0)

       (repeat NbreAutresFenetres

	 (setq HauteurFenetre (cdr (assoc 41 (entget (ssname ObjAutesFenetres index)))))
	 (setq CentreFenetre (cdr (assoc 10 (entget (ssname ObjAutesFenetres index)))))

	 (setq positionFenetre (polar CentreFenetreRefx (* 0.5 pi) (+ (/ HauteurFenetreRefx 2.0) EcartEntreFenetres (/ HauteurFenetre 2.0))))

	(if (= (cdr (assoc 340 (entget (ssname ObjAutesFenetres index)))) nil)
	 (command "_move" (ssname ObjAutesFenetres index) "" CentreFenetre positionFenetre)
	 (command "_move" (cdr (assoc 340 (entget (ssname ObjAutesFenetres index)))) "" CentreFenetre positionFenetre)
	  )

	 (setq HauteurFenetreRefx HauteurFenetre)
	 (setq CentreFenetreRefX positionFenetre)

	 (setq index (1+ index))

	 )
       )

      ((= ChoixPostionFenetres "S") ;; Dessous

       (setq index 0)

       (repeat NbreAutresFenetres

	 (setq HauteurFenetre (cdr (assoc 41 (entget (ssname ObjAutesFenetres index)))))
	 (setq CentreFenetre (cdr (assoc 10 (entget (ssname ObjAutesFenetres index)))))
	 (setq positionFenetre (polar CentreFenetreRefx (* 1.5 pi) (+ (/ HauteurFenetreRefx 2.0) EcartEntreFenetres (/ HauteurFenetre 2.0))))

	 	(if (= (cdr (assoc 340 (entget (ssname ObjAutesFenetres index)))) nil)
	 (command "_move" (ssname ObjAutesFenetres index) "" CentreFenetre positionFenetre)
	 (command "_move" (cdr (assoc 340 (entget (ssname ObjAutesFenetres index)))) "" CentreFenetre positionFenetre)
	  )


	 (setq HauteurFenetreRefx HauteurFenetre)
	 (setq CentreFenetreRefX positionFenetre)

	 (setq index (1+ index))

	 )
       )

      ((= ChoixPostionFenetres "G") ;; Gauche

       (setq index 0)

       (repeat NbreAutresFenetres

	 (setq LargeurFenetre (cdr (assoc 40 (entget (ssname ObjAutesFenetres index)))))
	 (setq CentreFenetre (cdr (assoc 10 (entget (ssname ObjAutesFenetres index)))))
	 (setq positionFenetre (polar CentreFenetreRefx pi (+ (/ largeurFenetreRefx 2.0) EcartEntreFenetres (/ largeurFenetre 2.0))))

	 	(if (= (cdr (assoc 340 (entget (ssname ObjAutesFenetres index)))) nil)
	 (command "_move" (ssname ObjAutesFenetres index) "" CentreFenetre positionFenetre)
	 (command "_move" (cdr (assoc 340 (entget (ssname ObjAutesFenetres index)))) "" CentreFenetre positionFenetre)
	  )


	 (setq largeurFenetreRefx LargeurFenetre)
	 (setq CentreFenetreRefX positionFenetre)

	 (setq index (1+ index))

	 )
       )

      ((= ChoixPostionFenetres "D") ;; Droite

       (setq index 0)

       (repeat NbreAutresFenetres

	 (setq LargeurFenetre (cdr (assoc 40 (entget (ssname ObjAutesFenetres index)))))
	 (setq CentreFenetre (cdr (assoc 10 (entget (ssname ObjAutesFenetres index)))))
	 (setq positionFenetre (polar CentreFenetreRefx 0 (+ (/ largeurFenetreRefx 2.0) EcartEntreFenetres (/ largeurFenetre 2.0))))

	 	(if (= (cdr (assoc 340 (entget (ssname ObjAutesFenetres index)))) nil)
	 (command "_move" (ssname ObjAutesFenetres index) "" CentreFenetre positionFenetre)
	 (command "_move" (cdr (assoc 340 (entget (ssname ObjAutesFenetres index)))) "" CentreFenetre positionFenetre)
	  )


	 (setq largeurFenetreRefx LargeurFenetre)
	 (setq CentreFenetreRefX positionFenetre)

	 (setq index (1+ index))

	 )
       )

      ); cond

 (setvar "osmode" osmode)
    
  );progn
    (alert "La sélection des fenêtres est incorrecte.")
    );if
    
    );progn
  (Alert "Fenêtre de référence incorrecte.")
  );if

 
  (print "*** www.dominique-vaquand.com ***")
  (princ)
  
  )