PRO SETPLOT, DEVICE, COPY=COPY, INTERPOLATE=INTERPOLATE
;
    ON_ERROR,1
    COMMON PLOTFILE,NAMES,SAVE
;
;  Check the number of parameters.
;
    IF N_PARAMS(0) EQ 0 THEN BEGIN
        PRINT,'*** SETPLOT must be called with one parameter:'
        PRINT,'                   DEVICE'
        RETURN
    ENDIF
;
;  Disable any SETSCALE settings.
;
    SETSCALE
;
;  Define the structure.
;
    STORE_INTO_SV, SV
;
;  Check to see if the common block variables have been initialized.
;
    IF N_ELEMENTS(NAMES) EQ 0 THEN ADD_DEVICE,!D.NAME,SV
;
;  Get the number of the current plot device.
;
    I_DEVICE = WHERE(NAMES EQ !D.NAME, N_FOUND)
    IF N_FOUND EQ 0 THEN BEGIN
        ADD_DEVICE,!D.NAME,SV
        I_DEVICE = WHERE(NAMES EQ !D.NAME)
    ENDIF
    I_DEVICE = I_DEVICE(0)
;
;  If the device is being changed, then store the current system variables.
;
    IF STRUPCASE(DEVICE) NE !D.NAME THEN BEGIN
        SAVE(I_DEVICE) = SV
;
;  Get the current maximum number of colors.
;
        N_COLORS = !D.TABLE_SIZE
;
;  Change the plotting device.
;
        SET_PLOT, DEVICE, COPY=KEYWORD_SET(COPY),   $
            INTERPOLATE=KEYWORD_SET(INTERPOLATE)
;
;  If copy was set, then set the top color to be equal to the maximum number of
;  colors.
;
        IF KEYWORD_SET(COPY) AND NOT KEYWORD_SET(INTERPOLATE)   $
                THEN BEGIN
            TOP = N_COLORS - 1
            SETFLAG,TOP=TOP
            IF !P.COLOR GT TOP THEN !P.COLOR = TOP
        ENDIF
;
;  Get the number of the new plotting device.
;
        I_DEVICE = WHERE(NAMES EQ !D.NAME,N_FOUND)
        IF N_FOUND EQ 0 THEN BEGIN
            STORE_INTO_SV, SV
            ADD_DEVICE,!D.NAME,SV
            I_DEVICE = WHERE(NAMES EQ !D.NAME)
        ENDIF
        I_DEVICE = I_DEVICE(0)
    ENDIF
;
;  Restore the system variables from the saved arrays.  This is done even if
;  the plotting device is not changed.  By using SETPLOT on the device one is
;  already set to, one can reinitialize the system variables.
;
    SV = SAVE(I_DEVICE)
    !P.CHARSIZE   = SV.CHARSIZE
    !P.FONT       = SV.FONT
    !P.COLOR      = SV.COLOR
    !P.BACKGROUND = SV.BACKGROUND
    !P.REGION     = SV.REGION
    !P.CLIP       = SV.CLIP
    !P.POSITION   = SV.POSITION
    !P.THICK      = SV.THICK
    !P.CHARTHICK  = SV.CHARTHICK
    !P.NOERASE    = SV.NOERASE
    !X.TYPE       = SV.XTYPE
    !X.CRANGE     = SV.XCRANGE
    !X.S          = SV.XS
    !X.MARGIN     = SV.XMARGIN
    !X.WINDOW     = SV.XWINDOW
    !X.REGION     = SV.XREGION
    !X.THICK      = SV.XTHICK
    !Y.TYPE       = SV.YTYPE
    !Y.CRANGE     = SV.YCRANGE
    !Y.S          = SV.YS
    !Y.MARGIN     = SV.YMARGIN
    !Y.WINDOW     = SV.YWINDOW
    !Y.REGION     = SV.YREGION
    !Y.THICK      = SV.YTHICK
    !Z.TYPE       = SV.ZTYPE
    !Z.CRANGE     = SV.ZCRANGE
    !Z.S          = SV.ZS
    !Z.MARGIN     = SV.ZMARGIN
    !Z.WINDOW     = SV.ZWINDOW
    !Z.REGION     = SV.ZREGION
    !Z.THICK      = SV.ZTHICK
    !ASPECT       = SV.ASPECT
    !BCOLOR       = SV.BCOLOR
;
    RETURN
    END