;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                                                                   ;;
;;   ROUTINES declared :-                                            ;;
;;                                                                   ;;
;;       c:rubix                                                     ;;
;;                                                                   ;;
;;       Copyright (c) K4 CAD Solutions 2021 (v2)                    ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; mods: Arkance Systems CZ - www.arkance-systems.cz - www.cadforum.cz

;;; (setq k4cube nil) now in icad.lsp

(defun C:RUBIX (/ vlist K4VLIST randnums randpos randprec k4randno
                  rsolid insets crsolid rubsols vc vcx vcy vh ssz vw xshift
                  yshift nkscale face0 face1 face2 face3 face4 face5 c2
                  rubars fpnts fpnt1 fpnt2 fpnt3 fpnt4 newfpnts aface asol
                  newcol ncol cpnts apnt inset count ahx ahy abx aby dhx dhy
                  dhxh dhyh dhxq dhyq dhxe dhye dbx dby dbxh dbyh dbxq dbyq
                  ahpntx ahpnty ab1pntx ab1pnty ab2pntx ab2pnty ahpnt alen
                  hlen qlen ab1pnt ab2pnt awid butcen butcen1 butcen2 butcen3
                  cbutcen butcol acen txtstr txtpos qhit facehit pnt prta
                  prtb faceno dist1 mord nf0 nf1 nf2 nf3 nf4 nf5 edata e62
                  ecol newe62 newdata c3 ename2
                  sorthit mixhit mixed mixcount )


  (setq vlist (list "CMDECHO" "BLIPMODE" "OSMODE" "PLINEWID" "SNAPMODE" "ANGDIR"
    "SNAPANG" "ORTHOMODE" "CECOLOR" "TEXTSIZE" "GRIDMODE" "UCSICON"))
  (setq K4VLIST nil)
  (repeat (length vlist)
    (setq K4VLIST (append K4VLIST (list (list (car vlist) (getvar (car vlist))))))
    (setq vlist (cdr vlist))
  )

  (setq randnums (strcat 
    "0572922129322551804995554277971780742813388955241544026124438466396141548899098599999090654885943544"
    "4003744213004318694088276845671115457616670121349118378284123489426793382243608803365063474620756750"
    "1172855310398396998914573480519758612431459563502798950094865716240742239250582593136312145382044347"
    "3213605986579638466709896698238914630284807281753375018832810388878505839341542156564045354427686847"
    "5774631795361239747226572290935550154166070469282988451956048226902980387690218960136015638780619567"
    "5936210431135062485019663473587236047527490257016156825483019241857424671662343004234404805256209315"
    "1511868184324591722612914195483582014804752575755288283420294429684243221806082287060051212297220173"
    "8399860031525166258204549525540328119710754982997006145260797900766750083421709858692591178236771142"
    "9963436551015456990585109318614910733427393496381896958835442390524348914744741748039279485412854868"
    "0328375414619845230313875461345976284634431750763879325766356816016913069120111283250198924093886357" ))
  (setq randpos 1)
  (setq randprec 6)
  (setq k4randno 0.0)

  (setvar "CMDECHO" 0)
  (setvar "BLIPMODE" 0)
  (setvar "OSMODE" 0)
  (setvar "PLINEWID" 0)
  (setvar "SNAPMODE" 0)
  (setvar "ANGDIR" 0)
  (setvar "SNAPANG" 0)
  (setvar "ORTHOMODE" 0)
  (setvar "GRIDMODE" 0)
  (setvar "UCSICON" 0)

  (command "_undo" "_group")

  (setq rsolid '(
    ((0.0 1.1046) (-0.3083 0.9613) (0.3083 0.9613) (0.0 0.8087)) 
    ((-0.3402 0.9465) (-0.6707 0.7929) (-0.0319 0.7929) (-0.3632 0.6290))
    ((0.0 0.7770) (-0.3313 0.6120) (0.3313 0.6120) (0.0 0.4355))
    ((0.3402 0.9465) (0.6707 0.7929) (0.0319 0.7929) (0.3632 0.6290))
    ((-0.7050 0.7770) (-1.0601 0.6120) (-0.3975 0.6120) (-0.7543 0.4355))
    ((-0.3656 0.5949) (-0.7225 0.4172) (-0.0344 0.4172) (-0.3922 0.2265))
    ((0.0 0.3987) (-0.3579 0.2066) (0.3579 0.2066) (0.0 0.0))
    ((0.3656 0.5949) (0.7225 0.4172) (0.0344 0.4172) (0.3922 0.2265))
    ((0.7050 0.7770) (1.0601 0.6120) (0.3975 0.6120) (0.7543 0.4355))
    ((-1.0601 0.6120) (-0.7543 0.4355) (-1.0254 0.2220) (-0.7288 0.0383))
    ((-0.7225 0.4172) (-0.3922 0.2265) (-0.6980 0.0192) (-0.3785 -0.1788))
    ((-0.3579 0.2066) (0.0 0.0) (-0.3453 -0.1993) (0.0 -0.4133))
    ((0.3579 0.2066) (0.0 0.0) (0.3453 -0.1993) (0.0 -0.4133))
    ((0.7225 0.4172) (0.3922 0.2265) (0.6980 0.0192) (0.3785 -0.1788))
    ((1.0601 0.6120) (0.7543 0.4355) (1.0254 0.2220) (0.7288 0.0383))
    ((-1.0221 0.1844) (-0.7263 0.0) (-0.9898 -0.1786) (-0.7027 -0.3688))
    ((-0.6957 -0.0191) (-0.3771 -0.2177) (-0.6729 -0.3885) (-0.3644 -0.5929))
    ((-0.3441 -0.2384) (0.0 -0.4529) (-0.3324 -0.6141) (0.0 -0.8343))
    ((0.3441 -0.2384) (0.0 -0.4529) (0.3324 -0.6141) (0.0 -0.8343))
    ((0.6957 -0.0191) (0.3771 -0.2177) (0.6729 -0.3885) (0.3644 -0.5929))
    ((1.0221 0.1844) (0.7263 0.0) (0.9898 -0.1786) (0.7027 -0.3688))
    ((-0.9867 -0.2136) (-0.7004 -0.4044) (-0.9566 -0.5523) (-0.6783 -0.7477))
    ((-0.6707 -0.4241) (-0.3632 -0.6290) (-0.6495 -0.7679) (-0.3513 -0.9773))
    ((-0.3313 -0.6503) (0.0 -0.8710) (-0.3204 -0.9990) (0.0 -1.2241))
    ((0.3313 -0.6503) (0.0 -0.8710) (0.3204 -0.9990) (0.0 -1.2241))
    ((0.6707 -0.4241) (0.3632 -0.6290) (0.6495 -0.7679) (0.3513 -0.9773))
    ((0.9867 -0.2136) (0.7004 -0.4044) (0.9566 -0.5523) (0.6783 -0.7477)) ))

  (setq insets nil)
  (setq rubsols (ssadd))
  (setq rubars (ssadd))
  (setq k4selset (ssadd))

  (if (= (tblsearch "UCS" "k4ucs") nil)
    (command "_ucs" "_s" "k4ucs")
    (command "_ucs" "_s" "k4ucs" "_y")
  )
  
  (command "_zoom" "_w" "-1,-1" "1,1")
  
  (command "_ucs" "_v")
  (setq vc (getvar "viewctr"))
  (setq vcx (car vc))
  (setq vcy (cadr vc))
  (setq vh (getvar "viewsize"))
  (setq ssz (getvar "screensize"))
  (setq vw (* (/ (car ssz) (cadr ssz)) vh))

  (setq xshift -0.5)
  (setq yshift +0.05)

  ;;;; dummy text to stop highlighting
  (command "_text" vc (/ vh 100) "0" " ")
  (if (entlast) (ssadd (entlast) k4selset))

  (grclear)

  (if (eq k4cube nil)
    (setq k4cube '(
     "GGGGGGGGG" "BBBBBBBBB" "RRRRRRRRR"
     "MMMMMMMMM" "YYYYYYYYY" "CCCCCCCCC" ))
  )

  (setq face0 (car k4cube))
  (setq face2 (caddr k4cube))
  (setq face4 (car (cddddr k4cube)))

  (setq c2 0)

  (setq crsolid nil)
  (setq nkscale (/ vh 3.0))
  
  (setq idx 0)  ;; remove later
  (repeat 27
    (setq idx (+ idx 1))
    (setq fpnts (car rsolid))
    (setq fpnt1 (car fpnts))
    (setq fpnt2 (cadr fpnts))
    (setq fpnt3 (caddr fpnts))
    (setq fpnt4 (cadddr fpnts))

    (setq fpnt1 (list (+ (* (+ (car fpnt1) xshift) nkscale) vcx)
                      (+ (* (+ (cadr fpnt1) yshift) nkscale) vcy) ))
    (setq fpnt2 (list (+ (* (+ (car fpnt2) xshift) nkscale) vcx)
                      (+ (* (+ (cadr fpnt2) yshift) nkscale) vcy) ))
    (setq fpnt3 (list (+ (* (+ (car fpnt3) xshift) nkscale) vcx)
                      (+ (* (+ (cadr fpnt3) yshift) nkscale) vcy) ))
    (setq fpnt4 (list (+ (* (+ (car fpnt4) xshift) nkscale) vcx)
                      (+ (* (+ (cadr fpnt4) yshift) nkscale) vcy) ))



    (if (= idx 1) (setq top_pnt fpnt1))
	
    (setq newfpnts (list fpnt1 fpnt2 fpnt3 fpnt4))
    (print (strcat "idx=" (itoa idx)))      ;; remove later
	(print newfpnts)      ;; remove later
    (setq crsolid (cons newfpnts crsolid))
    (setq rsolid (cdr rsolid))
  )
  (setq rsolid (reverse crsolid))
  (setq crsolid rsolid)

  (repeat 27  

    (if (and (>= c2 0) (<= c2 8)) 
      (setq aface face0)
      (if (or (and (>= c2 9) (<= c2 11))
              (and (>= c2 15) (<= c2 17))
              (and (>= c2 21) (<= c2 23))) 
        (setq aface face2)
        (setq aface face4)))
    (if (or (= c2 4) (= c2 9) (= c2 12)) 
      (setq asol 1)
      (if (or (= c2 1) (= c2 10) (= c2 13)) 
        (setq asol 2)
        (if (or (= c2 0) (= c2 11) (= c2 14)) 
          (setq asol 3)
          (if (or (= c2 5) (= c2 15) (= c2 18)) 
            (setq asol 4)
            (if (or (= c2 2) (= c2 16) (= c2 19)) 
              (setq asol 5)
              (if (or (= c2 3) (= c2 17) (= c2 20)) 
                (setq asol 6)
                (if (or (= c2 6) (= c2 21) (= c2 24)) 
                  (setq asol 7)
                  (if (or (= c2 7) (= c2 22) (= c2 25)) 
                    (setq asol 8)
                    (if (or (= c2 8) (= c2 23) (= c2 26)) 
                      (setq asol 9)
                    )))))))))
    ; green, blue, red, magenta, yellow, cyan
    (setq newcol (substr aface asol 1)) 
    (if (= newcol "G")
      (setq ncol 3) 
      (if (= newcol "B")
        (setq ncol 5)
        (if (= newcol "R")
          (setq ncol 1)
          (if (= newcol "M")
            (setq ncol 6)
            (if (= newcol "Y")
              (setq ncol 2)
              (setq ncol 4))))))
    
    (command "_color" ncol)
  
    (setq fpnts (car crsolid))
    (setq cpnts fpnts)
    (command "_solid")
    (repeat 4
      (setq apnt (car cpnts))
      (command apnt)
      (setq cpnts (cdr cpnts))
    )
    (command "")

    (setq c2 (1+ c2))
    (ssadd (entlast) rubsols)
    (setq inset (inters (car fpnts) (cadddr fpnts) (cadr fpnts) (caddr fpnts)))
    (setq insets (cons inset insets))
  
    (setq crsolid (cdr crsolid))
  )

  (command "_color" 18);; brown
  (setq count 0)
  (repeat 27
    (setq fpnts (car rsolid))
    (if (not (or (= count 2) (= count 16) (= count 19)))
      (progn
        (if (or (= count 0) (= count 1) (= count 9)
                (= count 15) (= count 21) (= count 22))
          (progn
            (setq ahx (+ (/ (- (car (car fpnts)) (car (caddr fpnts))) 2)
                         (car (caddr fpnts))))
            (setq ahy (+ (/ (- (cadr (car fpnts)) (cadr (caddr fpnts))) 2)
                         (cadr (caddr fpnts))))
          ))
        (if (or (= count 4) (= count 5) (= count 6)
                (= count 10) (= count 11) (= count 17) (= count 23))
          (progn
            (setq ahx (+ (/ (- (car (cadr fpnts)) (car (cadddr fpnts))) 2)
                         (car (cadddr fpnts))))
            (setq ahy (+ (/ (- (cadr (cadr fpnts)) (cadr (cadddr fpnts))) 2)
                         (cadr (cadddr fpnts))))
          ))
        (if (or (= count 12) (= count 13) (= count 14)
                (= count 18) (= count 3) (= count 8))
          (progn
            (setq ahx (+ (/ (- (car (car fpnts)) (car (cadr fpnts))) 2)
                         (car (cadr fpnts))))
            (setq ahy (+ (/ (- (cadr (car fpnts)) (cadr (cadr fpnts))) 2)
                         (cadr (cadr fpnts))))
          ))
        (if (or (= count 7) (= count 20) (= count 24)
                (= count 25) (= count 26))
          (progn
            (setq ahx (+ (/ (- (car (caddr fpnts)) (car (cadddr fpnts))) 2)
                         (car (cadddr fpnts))))
            (setq ahy (+ (/ (- (cadr (caddr fpnts)) (cadr (cadddr fpnts))) 2)
                         (cadr (cadddr fpnts))))
          ))
      
        (if (or (= count 12) (= count 13) (= count 14) (= count 18) 
                (= count 20) (= count 24) (= count 25) (= count 26))
          (progn
            (setq abx (+ (/ (- (car (cadr fpnts)) (car (cadddr fpnts))) 2)
                         (car (cadddr fpnts))))
            (setq aby (+ (/ (- (cadr (cadr fpnts)) (cadr (cadddr fpnts))) 2)
                         (cadr (cadddr fpnts))))
          )
          (if (or (= count 3) (= count 7) (= count 8))
            (progn
              (setq abx (+ (/ (- (car (car fpnts)) (car (caddr fpnts))) 2)
                           (car (caddr fpnts))))
              (setq aby (+ (/ (- (cadr (car fpnts)) (cadr (caddr fpnts))) 2)
                           (cadr (caddr fpnts))))
            )
            (progn
              (setq abx (+ (/ (- (car (car fpnts)) (car (cadr fpnts))) 2)
                           (car (cadr fpnts))))
              (setq aby (+ (/ (- (cadr (car fpnts)) (cadr (cadr fpnts))) 2)
                           (cadr (cadr fpnts))))
            )
          )
        )
        (setq dhx (- ahx (car (nth (- 26 count) insets))))
        (setq dhy (- ahy (cadr (nth (- 26 count) insets))))
        (setq dhxh (/ dhx 2))
        (setq dhyh (/ dhy 2))
        (setq dhxq (/ dhx 4))
        (setq dhyq (/ dhy 4))
        (setq dhxe (/ dhx 8))
        (setq dhye (/ dhy 8))
      
        (setq dbx (- abx (car (nth (- 26 count) insets))))
        (setq dby (- aby (cadr (nth (- 26 count) insets))))
        (setq dbxh (/ dbx 3))
        (setq dbyh (/ dby 3))
        (setq dbxq (/ dbx 6))
        (setq dbyq (/ dby 6))

        (if (or (= count 1) (= count 7) (= count 10)
                (= count 18) (= count 20) (= count 22))
          (progn
            (setq ahpntx (- (+ (car (nth (- 26 count) insets)) dhxh) dhxq))
            (setq ahpnty (- (+ (cadr (nth (- 26 count) insets)) dhyh) dhyq))
            (setq ab1pntx (- (+ (car (nth (- 26 count) insets)) dbxh) dhxq))
            (setq ab1pnty (- (+ (cadr (nth (- 26 count) insets)) dbyh) dhyq))
            (setq ab2pntx (- (- (car (nth (- 26 count) insets)) dbxh) dhxq))
            (setq ab2pnty (- (- (cadr (nth (- 26 count) insets)) dbyh) dhyq))
          )  
          (progn
            (setq ahpntx (- (+ (car (nth (- 26 count) insets)) dhxq) dhxe))
            (setq ahpnty (- (+ (cadr (nth (- 26 count) insets)) dhyq) dhye))
            (setq ab1pntx (- (+ (car (nth (- 26 count) insets)) dbxq) dhxe))
            (setq ab1pnty (- (+ (cadr (nth (- 26 count) insets)) dbyq) dhye))
            (setq ab2pntx (- (- (car (nth (- 26 count) insets)) dbxq) dhxe))
            (setq ab2pnty (- (- (cadr (nth (- 26 count) insets)) dbyq) dhye))
          )  
        ) 

        (setq ahpnt (list ahpntx ahpnty))
        (setq alen (distance (nth (- 26 count) insets) ahpnt))
      
        (setq hlen (/ alen 2))
        (setq qlen (/ alen 4))
        (setq ab1pnt (list ab1pntx ab1pnty))
        (setq ab2pnt (list ab2pntx ab2pnty))
        (if (or (= count 1) (= count 7) (= count 10) 
                (= count 18) (= count 20) (= count 22))
          (setq awid (* 0.005 nkscale))
          (setq awid (* 0.002 nkscale))
        )
        (command "_pline" ab1pnt "_w" awid awid ahpnt ab2pnt "")
        (ssadd (entlast) rubars)

      )
    )
    (setq count (1+ count))

    (setq rsolid (cdr rsolid))
  )

  (setq butcen '((1.6634 0.5224) (1.6634 -0.0597) (1.6634 -0.6419)))
  (setq lift 0.5)
  (setq butcen1 (list (+ (* (+ (car (car butcen)) xshift) nkscale) vcx)
                      (+ (* (+ (cadr (car butcen)) yshift lift) nkscale) vcy) ))
  (setq butcen2 (list (+ (* (+ (car (cadr butcen)) xshift) nkscale) vcx)
                      (+ (* (+ (cadr (cadr butcen)) yshift lift) nkscale) vcy) ))
  (setq butcen3 (list (+ (* (+ (car (caddr butcen)) xshift) nkscale) vcx)
                      (+ (* (+ (cadr (caddr butcen)) yshift lift) nkscale) vcy) ))

  (setq butcen (list butcen1 butcen2 butcen3))
  (setq count 0)
  (setq cbutcen butcen)
  (repeat 3
    (if (= count 0)
      (setq butcol 3)
      (if (= count 1)
        (setq butcol 1)
        (setq butcol 5)
      )
    )
    (setq acen (car cbutcen))
    (command "_color" butcol "_donut" 0.0 (* 0.3 nkscale) acen "")
    (ssadd (entlast) k4selset)
    (setq cbutcen (cdr cbutcen))
    (setq count (1+ count))
  )

  (command "_color" 7)

  (setq count 0)
  (setq cbutcen butcen)
  (repeat 3
    (if (= count 0)
      (setq txtstr "SORT")
      (if (= count 1)
        (setq txtstr "MIX")
        (setq txtstr "QUIT")
      )
    )
    (setq acen (car cbutcen))
    (setq txtpos (list (+ (* (+ 1.88 xshift) nkscale) vcx)
                       (- (cadr acen) (* 0.05 nkscale)) ))
    (command "_text" txtpos (* 0.10 nkscale) 0 txtstr)
    (ssadd (entlast) k4selset)
    (setq cbutcen (cdr cbutcen))
    (setq count (1+ count))
  )

  (setq txtpos (list (+ (* (+ 1.88 xshift) nkscale) vcx)
                     (+ (* (+ (* 1.2 -1) yshift lift) nkscale) vcy) ))

  (command "_text" "_c" txtpos (* 0.10 nkscale) 0 "K4KUBE")
  (ssadd (entlast) k4selset)
  (setq txtpos (list (car txtpos) (- (cadr txtpos) (* 0.1 nkscale))))
  (command "_text" "_c" txtpos (* 0.05 nkscale) 0 "Large arrows rotate cube")
  (ssadd (entlast) k4selset)
  (setq txtpos (list (car txtpos) (- (cadr txtpos) (* 0.1 nkscale))))
  (command "_text" "_c" txtpos (* 0.05 nkscale) 0 "Small arrows rotate layer")
  (ssadd (entlast) k4selset)

  (setq txtpos (list (car top_pnt) (+ (cadr top_pnt) (* 0.15 nkscale))))
  (command "_text" "_c" txtpos (* 0.10 nkscale) 0 "K 4  C A D  S o l u t i o n s")
  (ssadd (entlast) k4selset)

  ;;;;;;;;;;;;;;;;;main loop 
  ;;;;;;;;;;;;;;;;;main loop 
  ;;;;;;;;;;;;;;;;;main loop 
  ;;;;;;;;;;;;;;;;;main loop

  (setq qhit -1)
  (setq sorthit -1)
  (setq mixhit -1)

  (while (= qhit -1)

    (setq face0 (car k4cube))
    (setq face1 (cadr k4cube))
    (setq face2 (caddr k4cube))
    (setq face3 (cadddr k4cube))
    (setq face4 (car (cddddr k4cube)))
    (setq face5 (cadr (cddddr k4cube)))

    (setq facehit -1)
    (while (and (= facehit -1) (= qhit -1) (= sorthit -1) (= mixhit -1))

      (setq pnt (grread))
      (setq prta (car pnt))
      (setq prtb (cadr pnt))

      (if (eq prta 3)
        (progn
          (setq faceno 0)
          (while (and (= facehit -1) (< faceno 27))
            (setq acen (nth (- 26 faceno) insets))
            (setq dist1 (distance acen prtb))
            (if (<= dist1 (* 0.12 nkscale))
              (setq facehit faceno)
              (setq faceno (1+ faceno))
            )
            (if (or (= facehit 2) (= facehit 16) (= facehit 19))
              (progn
                (setq facehit -1)
                (setq faceno 27)
              )
            )
          );while
          (if (= facehit -1)
            (progn
              (setq dist1 (distance butcen1 prtb))
              (if (<= dist1 (* 0.15 nkscale))
                (setq sorthit 1)
                (progn
                  (setq dist1 (distance butcen2 prtb))
                  (if (<= dist1 (* 0.15 nkscale))
                    (progn
                      (setq mixhit 1)
                      (setq mixed 0)
                      (setq mixcount 10)
                    )
                    (progn
                      (setq dist1 (distance butcen3 prtb))
                      (if (<= dist1 (* 0.15 nkscale))
                        (setq qhit 1)
                      )
                    )
                  )
                )
              )
            )
          )
        );progn
      );if
    );while

    (if (= mixhit 1)
      (if (< mixed mixcount)
        (progn
          (if (= mixed 0)
            (progn
		      (setq k4t (GETVAR "DATE"))
		      (setq randpos (+ (rem (fix (* (- k4t (fix k4t)) 100000000)) 100) 1))
            )
          )
          (setq facehit -1)
          (while (or (= facehit -1)
                     (= facehit 1) (= facehit 2) (= facehit 7)
                     (= facehit 10)(= facehit 16)(= facehit 22)
                     (= facehit 18)(= facehit 19)(= facehit 20))
            (setq anum "0.")
	    	(setq rnum (substr randnums randpos randprec))
    		(setq randpos (+ randpos randprec))
            (setq k4randno (atof (strcat anum rnum)))
            (if (= k4randno nil) (alert "k4randno = nil!!!"))
            (setq facehit (fix (* k4randno 27)))
          )
          (setq mixed (+ mixed 1))
        )
        (setq mixhit -1)
      )
    )

    (if (or (= facehit 4) (= facehit 5) (= facehit 6) (= facehit 7))
      (setq mord (list 26 20 19 25 14 13 12 18 24
        8 7 6 11 17 23 3 2 5 10 16 22 0 1 4 9 15 21)))
    (if (or (= facehit 0) (= facehit 3) (= facehit 8) (= facehit 1))
      (setq mord (list 26 25 19 20 24 18 12 13 14
        23 17 11 6 7 8 22 16 10 5 2 3 21 15 9 4 1 0)))
    (if (or (= facehit 9) (= facehit 15) (= facehit 21) (= facehit 22))
      (setq mord (list 0 3 2 1 8 7 6 5 4 14 13 12
        11 10 9 20 19 18 17 16 15 26 25 24 23 22 21)))
    (if (or (= facehit 11) (= facehit 17) (= facehit 23) (= facehit 10)
            (= sorthit 1))
      (setq mord (list 0 1 2 3 4 5 6 7 8 9 10 11 12
        13 14 15 16 17 18 19 20 21 22 23 24 25 26)))
    (if (or (= facehit 12) (= facehit 13) (= facehit 14) (= facehit 18))
      (setq mord (list 21 22 16 15 23 17 11 10 9 24
        18 12 6 5 4 25 19 13 7 2 1 26 20 14 8 3 0)))
    (if (or (= facehit 24) (= facehit 25) (= facehit 26) (= facehit 20))
      (setq mord (list 21 15 16 22 9 10 11 17 23 4
        5 6 12 18 24 1 2 7 13 19 25 0 3 8 14 20 26)))
    
    
    (if (= facehit 0)
      (progn
	(setq nf0 (strcat (substr face2 7 1) (substr face2 4 1) (substr face2 1 1)
				  (substr face0 4 6)))
	(setq nf1 (strcat (substr face3 7 1) (substr face3 4 1) (substr face3 1 1)
				  (substr face1 4 6)))
	(setq nf2 (strcat (substr face1 1 1) (substr face2 2 2) (substr face1 2 1)
				  (substr face2 5 2) (substr face1 3 1) (substr face2 8 2)))
	(setq nf3 (strcat (substr face0 1 1) (substr face3 2 2) (substr face0 2 1)
				  (substr face3 5 2) (substr face0 3 1) (substr face3 8 2)))
	(setq nf4 (substr face4 1 9))
	(setq nf5 (strcat (substr face5 7 1) (substr face5 4 1) (substr face5 1 1) 
				  (substr face5 8 1) (substr face5 5 1) (substr face5 2 1) 
				  (substr face5 9 1) (substr face5 6 1) (substr face5 3 1))) 
      ))

    (if (= facehit 4)
      (progn
    (setq nf0 (strcat (substr face3 1 1) (substr face3 4 1) (substr face3 7 1)
                      (substr face0 4 6)))
    (setq nf1 (strcat (substr face2 1 1) (substr face2 4 1) (substr face2 7 1)
                      (substr face1 4 6)))
    (setq nf2 (strcat (substr face0 3 1) (substr face2 2 2) (substr face0 2 1)
                      (substr face2 5 2) (substr face0 1 1) (substr face2 8 2)))
    (setq nf3 (strcat (substr face1 3 1) (substr face3 2 2) (substr face1 2 1)
                      (substr face3 5 2) (substr face1 1 1) (substr face3 8 2)))
    (setq nf4 (substr face4 1 9))
    (setq nf5 (strcat (substr face5 3 1) (substr face5 6 1) (substr face5 9 1) 
                      (substr face5 2 1) (substr face5 5 1) (substr face5 8 1) 
                      (substr face5 1 1) (substr face5 4 1) (substr face5 7 1))) 
      ))         

    (if (= facehit 3)
      (progn
    (setq nf0 (strcat (substr face0 1 3) 
                      (substr face2 8 1) (substr face2 5 1) (substr face2 2 1)
                      (substr face0 7 3)))
    (setq nf1 (strcat (substr face1 1 3) 
                      (substr face3 8 1) (substr face3 5 1) (substr face3 2 1)
                      (substr face1 7 3)))
    (setq nf2 (strcat (substr face2 1 1) (substr face1 4 1) 
                      (substr face2 3 2) (substr face1 5 1) 
                      (substr face2 6 2) (substr face1 6 1)
                      (substr face2 9 1)))
    (setq nf3 (strcat (substr face3 1 1) (substr face0 4 1) 
                      (substr face3 3 2) (substr face0 5 1) 
                      (substr face3 6 2) (substr face0 6 1)
                      (substr face3 9 1)))
    (setq nf4 (substr face4 1 9))
    (setq nf5 (substr face5 1 9))
      ))         

    (if (= facehit 5)
      (progn
    (setq nf0 (strcat (substr face0 1 3) 
                      (substr face3 2 1) (substr face3 5 1) (substr face3 8 1)
                      (substr face0 7 3)))
    (setq nf1 (strcat (substr face1 1 3) 
                      (substr face2 2 1) (substr face2 5 1) (substr face2 8 1)
                      (substr face1 7 3)))
    (setq nf2 (strcat (substr face2 1 1) (substr face0 6 1) 
                      (substr face2 3 2) (substr face0 5 1) 
                      (substr face2 6 2) (substr face0 4 1)
                      (substr face2 9 1)))
    (setq nf3 (strcat (substr face3 1 1) (substr face1 6 1) 
                      (substr face3 3 2) (substr face1 5 1) 
                      (substr face3 6 2) (substr face1 4 1)
                      (substr face3 9 1)))
    (setq nf4 (substr face4 1 9))
    (setq nf5 (substr face5 1 9))
      ))         

    (if (= facehit 8)
      (progn
    (setq nf0 (strcat (substr face0 1 6) 
                      (substr face2 9 1) (substr face2 6 1) (substr face2 3 1)))
    (setq nf1 (strcat (substr face1 1 6) 
                      (substr face3 9 1) (substr face3 6 1) (substr face3 3 1)))
    (setq nf2 (strcat (substr face2 1 2) (substr face1 7 1) 
                      (substr face2 4 2) (substr face1 8 1)
                      (substr face2 7 2) (substr face1 9 1)))
    (setq nf3 (strcat (substr face3 1 2) (substr face0 7 1) 
                      (substr face3 4 2) (substr face0 8 1)
                      (substr face3 7 2) (substr face0 9 1)))
    (setq nf4 (strcat (substr face4 7 1) (substr face4 4 1) (substr face4 1 1) 
                      (substr face4 8 1) (substr face4 5 1) (substr face4 2 1) 
                      (substr face4 9 1) (substr face4 6 1) (substr face4 3 1))) 
    (setq nf5 (substr face5 1 9))
      ))         

    (if (= facehit 6)
      (progn
    (setq nf0 (strcat (substr face0 1 6) 
                      (substr face3 3 1) (substr face3 6 1) (substr face3 9 1)))
    (setq nf1 (strcat (substr face1 1 6) 
                      (substr face2 3 1) (substr face2 6 1) (substr face2 9 1)))
    (setq nf2 (strcat (substr face2 1 2) (substr face0 9 1) 
                      (substr face2 4 2) (substr face0 8 1)
                      (substr face2 7 2) (substr face0 7 1)))
    (setq nf3 (strcat (substr face3 1 2) (substr face1 9 1) 
                      (substr face3 4 2) (substr face1 8 1)
                      (substr face3 7 2) (substr face1 7 1)))
    (setq nf4 (strcat (substr face4 3 1) (substr face4 6 1) (substr face4 9 1) 
                      (substr face4 2 1) (substr face4 5 1) (substr face4 8 1) 
                      (substr face4 1 1) (substr face4 4 1) (substr face4 7 1))) 
    (setq nf5 (substr face5 1 9))
      ))         

    (if (= facehit 1)
      (progn
    (setq nf0 (strcat (substr face2 7 1) (substr face2 4 1) (substr face2 1 1)
                      (substr face2 8 1) (substr face2 5 1) (substr face2 2 1)
                      (substr face2 9 1) (substr face2 6 1) (substr face2 3 1))) 
    (setq nf1 (strcat (substr face3 7 1) (substr face3 4 1) (substr face3 1 1)
                      (substr face3 8 1) (substr face3 5 1) (substr face3 2 1)
                      (substr face3 9 1) (substr face3 6 1) (substr face3 3 1)))
    (setq nf2 (strcat (substr face1 1 1) (substr face1 4 1) (substr face1 7 1)
                      (substr face1 2 1) (substr face1 5 1) (substr face1 8 1)
                      (substr face1 3 1) (substr face1 6 1) (substr face1 9 1)))
    (setq nf3 (strcat (substr face0 1 1) (substr face0 4 1) (substr face0 7 1)
                      (substr face0 2 1) (substr face0 5 1) (substr face0 8 1)
                      (substr face0 3 1) (substr face0 6 1) (substr face0 9 1)))
    (setq nf4 (strcat (substr face4 7 1) (substr face4 4 1) (substr face4 1 1) 
                      (substr face4 8 1) (substr face4 5 1) (substr face4 2 1) 
                      (substr face4 9 1) (substr face4 6 1) (substr face4 3 1))) 
    (setq nf5 (strcat (substr face5 7 1) (substr face5 4 1) (substr face5 1 1) 
                      (substr face5 8 1) (substr face5 5 1) (substr face5 2 1) 
                      (substr face5 9 1) (substr face5 6 1) (substr face5 3 1))) 
      ))         

    (if (= facehit 7)
      (progn
    (setq nf0 (strcat (substr face3 1 1) (substr face3 4 1) (substr face3 7 1)
                      (substr face3 2 1) (substr face3 5 1) (substr face3 8 1)
                      (substr face3 3 1) (substr face3 6 1) (substr face3 9 1)))
    (setq nf1 (strcat (substr face2 1 1) (substr face2 4 1) (substr face2 7 1)
                      (substr face2 2 1) (substr face2 5 1) (substr face2 8 1)
                      (substr face2 3 1) (substr face2 6 1) (substr face2 9 1)))
    (setq nf2 (strcat (substr face0 3 1) (substr face0 6 1) (substr face0 9 1)
                      (substr face0 2 1) (substr face0 5 1) (substr face0 8 1)
                      (substr face0 1 1) (substr face0 4 1) (substr face0 7 1)))
    (setq nf3 (strcat (substr face1 3 1) (substr face1 6 1) (substr face1 9 1)
                      (substr face1 2 1) (substr face1 5 1) (substr face1 8 1)
                      (substr face1 1 1) (substr face1 4 1) (substr face1 7 1)))
    (setq nf4 (strcat (substr face4 3 1) (substr face4 6 1) (substr face4 9 1) 
                      (substr face4 2 1) (substr face4 5 1) (substr face4 8 1) 
                      (substr face4 1 1) (substr face4 4 1) (substr face4 7 1))) 
    (setq nf5 (strcat (substr face5 3 1) (substr face5 6 1) (substr face5 9 1) 
                      (substr face5 2 1) (substr face5 5 1) (substr face5 8 1) 
                      (substr face5 1 1) (substr face5 4 1) (substr face5 7 1))) 
      ))         



    (if (= facehit 9)
      (progn
    (setq nf0 (strcat (substr face0 7 1) (substr face0 4 1) (substr face0 1 1)
                      (substr face0 8 1) (substr face0 5 1) (substr face0 2 1)
                      (substr face0 9 1) (substr face0 6 1) (substr face0 3 1)))
    (setq nf1 (substr face1 1 9))
    (setq nf2 (strcat (substr face4 1 3) 
                      (substr face2 4 6)))
    (setq nf3 (strcat (substr face5 1 3) 
                      (substr face3 4 6)))
    (setq nf4 (strcat (substr face3 3 1) (substr face3 2 1) (substr face3 1 1)
                      (substr face4 4 6)))
    (setq nf5 (strcat (substr face2 3 1) (substr face2 2 1) (substr face2 1 1)
                      (substr face5 4 6)))
      ))         

    (if (= facehit 11)
      (progn
    (setq nf0 (strcat (substr face0 3 1) (substr face0 6 1) (substr face0 9 1)
                      (substr face0 2 1) (substr face0 5 1) (substr face0 8 1)
                      (substr face0 1 1) (substr face0 4 1) (substr face0 7 1)))
    (setq nf1 (substr face1 1 9))
    (setq nf2 (strcat (substr face5 3 1) (substr face5 2 1) (substr face5 1 1)
                      (substr face2 4 6)))
    (setq nf3 (strcat (substr face4 3 1) (substr face4 2 1) (substr face4 1 1)
                      (substr face3 4 6)))
    (setq nf4 (strcat (substr face2 1 3) 
                      (substr face4 4 6)))
    (setq nf5 (strcat (substr face3 1 3) 
                      (substr face5 4 6)))
      ))         

    (if (= facehit 15)
      (progn
    (setq nf0 (substr face0 1 9))
    (setq nf1 (substr face1 1 9))
    (setq nf2 (strcat (substr face2 1 3) 
                      (substr face4 4 3) 
                      (substr face2 7 3)))
    (setq nf3 (strcat (substr face3 1 3) 
                      (substr face5 4 3) 
                      (substr face3 7 3)))
    (setq nf4 (strcat (substr face4 1 3) 
                      (substr face3 6 1) (substr face3 5 1) (substr face3 4 1)
                      (substr face4 7 3)))
    (setq nf5 (strcat (substr face5 1 3) 
                      (substr face2 6 1) (substr face2 5 1) (substr face2 4 1)
                      (substr face5 7 3)))
      ))         

    (if (= facehit 17)
      (progn
    (setq nf0 (substr face0 1 9))
    (setq nf1 (substr face1 1 9))
    (setq nf2 (strcat (substr face2 1 3) 
                      (substr face5 6 1) (substr face5 5 1) (substr face5 4 1)
                      (substr face2 7 3)))
    (setq nf3 (strcat (substr face3 1 3) 
                      (substr face4 6 1) (substr face4 5 1) (substr face4 4 1)
                      (substr face3 7 3)))
    (setq nf4 (strcat (substr face4 1 3) 
                      (substr face2 4 3) 
                      (substr face4 7 3)))
    (setq nf5 (strcat (substr face5 1 3) 
                      (substr face3 4 3) 
                      (substr face5 7 3)))
      ))         

    (if (= facehit 21)
      (progn
    (setq nf0 (substr face0 1 9))
    (setq nf1 (strcat (substr face1 7 1) (substr face1 4 1) (substr face1 1 1)
                      (substr face1 8 1) (substr face1 5 1) (substr face1 2 1)
                      (substr face1 9 1) (substr face1 6 1) (substr face1 3 1)))
    (setq nf2 (strcat (substr face2 1 6) 
                      (substr face4 7 3)))
    (setq nf3 (strcat (substr face3 1 6) 
                      (substr face5 7 3)))
    (setq nf4 (strcat (substr face4 1 6) 
                      (substr face3 9 1) (substr face3 8 1) (substr face3 7 1)))
    (setq nf5 (strcat (substr face5 1 6) 
                      (substr face2 9 1) (substr face2 8 1) (substr face2 7 1)))
      ))         

    (if (= facehit 23)
      (progn
    (setq nf0 (substr face0 1 9))
    (setq nf1 (strcat (substr face1 3 1) (substr face1 6 1) (substr face1 9 1)
                      (substr face1 2 1) (substr face1 5 1) (substr face1 8 1)
                      (substr face1 1 1) (substr face1 4 1) (substr face1 7 1)))
    (setq nf2 (strcat (substr face2 1 6) 
                      (substr face5 9 1) (substr face5 8 1) (substr face5 7 1)))
    (setq nf3 (strcat (substr face3 1 6) 
                      (substr face4 9 1) (substr face4 8 1) (substr face4 7 1)))
    (setq nf4 (strcat (substr face4 1 6) 
                      (substr face2 7 3)))
    (setq nf5 (strcat (substr face5 1 6) 
                      (substr face3 7 3)))
      ))         
    
    (if (= facehit 22)
      (progn
    (setq nf0 (strcat (substr face0 7 1) (substr face0 4 1) (substr face0 1 1)
                      (substr face0 8 1) (substr face0 5 1) (substr face0 2 1)
                      (substr face0 9 1) (substr face0 6 1) (substr face0 3 1)))
    (setq nf1 (strcat (substr face1 7 1) (substr face1 4 1) (substr face1 1 1)
                      (substr face1 8 1) (substr face1 5 1) (substr face1 2 1)
                      (substr face1 9 1) (substr face1 6 1) (substr face1 3 1)))
    (setq nf2 (substr face4 1 9))
    (setq nf3 (substr face5 1 9))
    (setq nf4 (strcat (substr face3 3 1) (substr face3 2 1) (substr face3 1 1)
                      (substr face3 6 1) (substr face3 5 1) (substr face3 4 1)
                      (substr face3 9 1) (substr face3 8 1) (substr face3 7 1)))
    (setq nf5 (strcat (substr face2 3 1) (substr face2 2 1) (substr face2 1 1)
                      (substr face2 6 1) (substr face2 5 1) (substr face2 4 1)
                      (substr face2 9 1) (substr face2 8 1) (substr face2 7 1)))
      ))         

    (if (= facehit 10)
      (progn
    (setq nf0 (strcat (substr face0 3 1) (substr face0 6 1) (substr face0 9 1)
                      (substr face0 2 1) (substr face0 5 1) (substr face0 8 1)
                      (substr face0 1 1) (substr face0 4 1) (substr face0 7 1)))
    (setq nf1 (strcat (substr face1 3 1) (substr face1 6 1) (substr face1 9 1)
                      (substr face1 2 1) (substr face1 5 1) (substr face1 8 1)
                      (substr face1 1 1) (substr face1 4 1) (substr face1 7 1)))
    (setq nf2 (strcat (substr face5 3 1) (substr face5 2 1) (substr face5 1 1)
                      (substr face5 6 1) (substr face5 5 1) (substr face5 4 1)
                      (substr face5 9 1) (substr face5 8 1) (substr face5 7 1)))
    (setq nf3 (strcat (substr face4 3 1) (substr face4 2 1) (substr face4 1 1)
                      (substr face4 6 1) (substr face4 5 1) (substr face4 4 1)
                      (substr face4 9 1) (substr face4 8 1) (substr face4 7 1)))
    (setq nf4 (substr face2 1 9))
    (setq nf5 (substr face3 1 9))
      ))         



    (if (= facehit 12)
      (progn
    (setq nf0 (strcat (substr face4 1 1) (substr face0 2 2) 
                      (substr face4 4 1) (substr face0 5 2)
                      (substr face4 7 1) (substr face0 8 2)))
    (setq nf1 (strcat (substr face5 1 1) (substr face1 2 2) 
                      (substr face5 4 1) (substr face1 5 2)
                      (substr face5 7 1) (substr face1 8 2)))
    (setq nf2 (strcat (substr face2 3 1) (substr face2 6 1) (substr face2 9 1) 
                      (substr face2 2 1) (substr face2 5 1) (substr face2 8 1) 
                      (substr face2 1 1) (substr face2 4 1) (substr face2 7 1))) 
    (setq nf3 (substr face3 1 9))
    (setq nf4 (strcat (substr face1 7 1) (substr face4 2 2) 
                      (substr face1 4 1) (substr face4 5 2)
                      (substr face1 1 1) (substr face4 8 2)))
    (setq nf5 (strcat (substr face0 7 1) (substr face5 2 2) 
                      (substr face0 4 1) (substr face5 5 2)
                      (substr face0 1 1) (substr face5 8 2)))
      ))         

    (if (= facehit 24)
      (progn
    (setq nf0 (strcat (substr face5 7 1) (substr face0 2 2) 
                      (substr face5 4 1) (substr face0 5 2)
                      (substr face5 1 1) (substr face0 8 2)))
    (setq nf1 (strcat (substr face4 7 1) (substr face1 2 2) 
                      (substr face4 4 1) (substr face1 5 2)
                      (substr face4 1 1) (substr face1 8 2)))
    (setq nf2 (strcat (substr face2 7 1) (substr face2 4 1) (substr face2 1 1) 
                      (substr face2 8 1) (substr face2 5 1) (substr face2 2 1) 
                      (substr face2 9 1) (substr face2 6 1) (substr face2 3 1))) 
    (setq nf3 (substr face3 1 9))
    (setq nf4 (strcat (substr face0 1 1) (substr face4 2 2) 
                      (substr face0 4 1) (substr face4 5 2)
                      (substr face0 7 1) (substr face4 8 2)))
    (setq nf5 (strcat (substr face1 1 1) (substr face5 2 2) 
                      (substr face1 4 1) (substr face5 5 2)
                      (substr face1 7 1) (substr face5 8 2)))
      ))         

    (if (= facehit 13)
      (progn
    (setq nf0 (strcat (substr face0 1 1) (substr face4 2 1) 
                      (substr face0 3 2) (substr face4 5 1)
                      (substr face0 6 2) (substr face4 8 1)
                      (substr face0 9 1)))
    (setq nf1 (strcat (substr face1 1 1) (substr face5 2 1) 
                      (substr face1 3 2) (substr face5 5 1)
                      (substr face1 6 2) (substr face5 8 1)
                      (substr face1 9 1)))
    (setq nf2 (substr face2 1 9))
    (setq nf3 (substr face3 1 9))
    (setq nf4 (strcat (substr face4 1 1) (substr face1 8 1) 
                      (substr face4 3 2) (substr face1 5 1)
                      (substr face4 6 2) (substr face1 2 1)
                      (substr face4 9 1)))
    (setq nf5 (strcat (substr face5 1 1) (substr face0 8 1) 
                      (substr face5 3 2) (substr face0 5 1)
                      (substr face5 6 2) (substr face0 2 1)
                      (substr face5 9 1)))
      ))         

    (if (= facehit 25)
      (progn
    (setq nf0 (strcat (substr face0 1 1) (substr face5 8 1) 
                      (substr face0 3 2) (substr face5 5 1)
                      (substr face0 6 2) (substr face5 2 1)
                      (substr face0 9 1)))
    (setq nf1 (strcat (substr face1 1 1) (substr face4 8 1) 
                      (substr face1 3 2) (substr face4 5 1)
                      (substr face1 6 2) (substr face4 2 1)
                      (substr face1 9 1)))
    (setq nf2 (substr face2 1 9))
    (setq nf3 (substr face3 1 9))
    (setq nf4 (strcat (substr face4 1 1) (substr face0 2 1) 
                      (substr face4 3 2) (substr face0 5 1)
                      (substr face4 6 2) (substr face0 8 1)
                      (substr face4 9 1)))
    (setq nf5 (strcat (substr face5 1 1) (substr face1 2 1) 
                      (substr face5 3 2) (substr face1 5 1)
                      (substr face5 6 2) (substr face1 8 1)
                      (substr face5 9 1)))
      ))         

    (if (= facehit 14)
      (progn
    (setq nf0 (strcat (substr face0 1 2) (substr face4 3 1) 
                      (substr face0 4 2) (substr face4 6 1)
                      (substr face0 7 2) (substr face4 9 1)))
    (setq nf1 (strcat (substr face1 1 2) (substr face5 3 1) 
                      (substr face1 4 2) (substr face5 6 1)
                      (substr face1 7 2) (substr face5 9 1)))
    (setq nf2 (substr face2 1 9))
    (setq nf3 (strcat (substr face3 3 1) (substr face3 6 1) (substr face3 9 1) 
                      (substr face3 2 1) (substr face3 5 1) (substr face3 8 1) 
                      (substr face3 1 1) (substr face3 4 1) (substr face3 7 1))) 
    (setq nf4 (strcat (substr face4 1 2) (substr face1 9 1) 
                      (substr face4 4 2) (substr face1 6 1)
                      (substr face4 7 2) (substr face1 3 1)))
    (setq nf5 (strcat (substr face5 1 2) (substr face0 9 1) 
                      (substr face5 4 2) (substr face0 6 1)
                      (substr face5 7 2) (substr face0 3 1)))
      ))         

    (if (= facehit 26)
      (progn
    (setq nf0 (strcat (substr face0 1 2) (substr face5 9 1) 
                      (substr face0 4 2) (substr face5 6 1)
                      (substr face0 7 2) (substr face5 3 1)))
    (setq nf1 (strcat (substr face1 1 2) (substr face4 9 1) 
                      (substr face1 4 2) (substr face4 6 1)
                      (substr face1 7 2) (substr face4 3 1)))
    (setq nf2 (substr face2 1 9))
    (setq nf3 (strcat (substr face3 7 1) (substr face3 4 1) (substr face3 1 1) 
                      (substr face3 8 1) (substr face3 5 1) (substr face3 2 1) 
                      (substr face3 9 1) (substr face3 6 1) (substr face3 3 1))) 
    (setq nf4 (strcat (substr face4 1 2) (substr face0 3 1) 
                      (substr face4 4 2) (substr face0 6 1)
                      (substr face4 7 2) (substr face0 9 1)))
    (setq nf5 (strcat (substr face5 1 2) (substr face1 3 1) 
                      (substr face5 4 2) (substr face1 6 1)
                      (substr face5 7 2) (substr face1 9 1)))
      ))         

    (if (= facehit 18)
      (progn
    (setq nf0 (substr face4 1 9))
    (setq nf1 (substr face5 1 9))
    (setq nf2 (strcat (substr face2 3 1) (substr face2 6 1) (substr face2 9 1)
                      (substr face2 2 1) (substr face2 5 1) (substr face2 8 1)
                      (substr face2 1 1) (substr face2 4 1) (substr face2 7 1)))
    (setq nf3 (strcat (substr face3 3 1) (substr face3 6 1) (substr face3 9 1)
                      (substr face3 2 1) (substr face3 5 1) (substr face3 8 1)
                      (substr face3 1 1) (substr face3 4 1) (substr face3 7 1)))
    (setq nf4 (strcat (substr face1 7 1) (substr face1 8 1) (substr face1 9 1)
                      (substr face1 4 1) (substr face1 5 1) (substr face1 6 1)
                      (substr face1 1 1) (substr face1 2 1) (substr face1 3 1)))
    (setq nf5 (strcat (substr face0 7 1) (substr face0 8 1) (substr face0 9 1)
                      (substr face0 4 1) (substr face0 5 1) (substr face0 6 1)
                      (substr face0 1 1) (substr face0 2 1) (substr face0 3 1)))
      ))         

    (if (= facehit 20)
      (progn
    (setq nf0 (strcat (substr face5 7 1) (substr face5 8 1) (substr face5 9 1)
                      (substr face5 4 1) (substr face5 5 1) (substr face5 6 1)
                      (substr face5 1 1) (substr face5 2 1) (substr face5 3 1)))
    (setq nf1 (strcat (substr face4 7 1) (substr face4 8 1) (substr face4 9 1)
                      (substr face4 4 1) (substr face4 5 1) (substr face4 6 1)
                      (substr face4 1 1) (substr face4 2 1) (substr face4 3 1)))
    (setq nf2 (strcat (substr face2 7 1) (substr face2 4 1) (substr face2 1 1)
                      (substr face2 8 1) (substr face2 5 1) (substr face2 2 1)
                      (substr face2 9 1) (substr face2 6 1) (substr face2 3 1)))
    (setq nf3 (strcat (substr face3 7 1) (substr face3 4 1) (substr face3 1 1)
                      (substr face3 8 1) (substr face3 5 1) (substr face3 2 1)
                      (substr face3 9 1) (substr face3 6 1) (substr face3 3 1)))
    (setq nf4 (substr face0 1 9))
    (setq nf5 (substr face1 1 9))
      ))         
    
    (if (= sorthit 1)
      (progn
        (setq nf0 "GGGGGGGGG")
        (setq nf1 "BBBBBBBBB")
        (setq nf2 "RRRRRRRRR")
        (setq nf3 "MMMMMMMMM")
        (setq nf4 "YYYYYYYYY")
        (setq nf5 "CCCCCCCCC")
      )
    )

    (if (or (and (>= facehit 0)(<= facehit 26)) (= sorthit 1) )
      (progn
        (setq count 0)
        (repeat 27
          (setq c2 (nth count mord))
          ;   (setq edata (entget (ssname rubsols (- 26 c2) )))
          ;    use above line if old ICAD
          (setq edata (entget (ssname rubsols c2)) )
          (setq e62 (assoc 62 edata))
          (setq ecol (cdr e62))
  
          (if (and (>= c2 0) (<= c2 8)) 
            (setq aface nf0)
            (if (or (and (>= c2 9) (<= c2 11))
                    (and (>= c2 15) (<= c2 17))
                    (and (>= c2 21) (<= c2 23))) 
              (setq aface nf2)
              (setq aface nf4)
            )
          )
      
          (if (or (= c2 4) (= c2 9) (= c2 12)) 
            (setq asol 1)
            (if (or (= c2 1) (= c2 10) (= c2 13)) 
              (setq asol 2)
              (if (or (= c2 0) (= c2 11) (= c2 14)) 
                (setq asol 3)
                (if (or (= c2 5) (= c2 15) (= c2 18)) 
                  (setq asol 4)
                  (if (or (= c2 2) (= c2 16) (= c2 19)) 
                    (setq asol 5)
                    (if (or (= c2 3) (= c2 17) (= c2 20)) 
                      (setq asol 6)
                      (if (or (= c2 6) (= c2 21) (= c2 24)) 
                        (setq asol 7)
                        (if (or (= c2 7) (= c2 22) (= c2 25)) 
                          (setq asol 8)
                          (if (or (= c2 8) (= c2 23) (= c2 26)) 
                            (setq asol 9)
                          )
                        )
                      )
                    )
                  )
                )
              )
            )
          ) 

          (setq newcol (substr aface asol 1)) 
          (if (= newcol "G")
            (setq ncol 3)
            (if (= newcol "B")
              (setq ncol 5)
              (if (= newcol "R")
                (setq ncol 1)
                (if (= newcol "M")
                  (setq ncol 6)
                  (if (= newcol "Y")
                    (setq ncol 2)
                    (setq ncol 4)))))
          )
        
          (if (/= ecol ncol) 
            (progn 
              (setq newe62 (cons '62 ncol))
              (setq newdata (subst newe62 e62 edata))
              (entmod newdata)
              (if (not (or (= c2 2) (= c2 16) (= c2 19)))
                (progn
                  (if (> c2 19)
                    (setq c3 (- c2 3))
                    (if (> c2 16)
                      (setq c3 (- c2 2))
                      (if (> c2 2)
                        (setq c3 (- c2 1))
                        (setq c3 c2)
                      )
                    )
                  )
                  ; (setq ename2 (ssname rubars (- 23 c3)) )
                  ; use above line if old ICAD
                  (setq ename2 (ssname rubars c3) )
                  (entupd ename2)
                )
              )
             )
          )
          (setq count (1+ count))
        );repeat
        (setq k4cube (list nf0 nf1 nf2 nf3 nf4 nf5))
      );progn
    );if (facehit >=0 and <=26) or sorthit = 1
    (if (= sorthit 1)
      (setq sorthit -1)
    )

  ) ;while qhit = -1

  (command "_erase" k4selset "")
  (command "_erase" rubars "")
  (command "_erase" rubsols "")
  (command "_redraw")

  (command "_ucs" "_r" "k4ucs")
  (setq k4selset nil)
  (setq rubsols nil)
  (setq rubars nil)

  (command "_undo" "_end")

  (setq a K4VLIST)
  (repeat (length a)
    (setvar (caar a) (cadar a) )
    (setq a (cdr a))
  )
  (prin1)
)
(prompt "k4kube.lsp successfully loaded. Type RUBIX to start.")
(prin1)

