Alright, so I now have the program and image set to what I had had in mind from the start! 😄 Hooray!
First, I would like to thank each and every person that was involved with this, and has helped me along the way. I know I would not have been able to get this done if it weren't for everyone's help. This is a truly incredible community, with clearly great people in it, and I'm so grateful to have come up with the idea and found this forum! A truly heart-felt thank you to everyone, I greatly appreciate it.
Second, I have one question that came to mind - within the forum, am I able to select more than one post as "Accept as solution"? If I can only select one post as the "solution", then I think the biggest credit needs to go to @WarrenKuhfeld , as he created almost exactly what I had pictured in mind. Thank you again, Warren! Also, I would like to thank @Reeza for help with the pathing issues I ran into with SAS UE.
Lastly, it is still going to be a few weeks before the big day actually happens, as I have to wait on her ring to be completed. We are having it custom-made, we picked out the design together, and tweaked some things about it (and I had them add "Leo" diamonds to it 😉 ). She knows that it's still in the process, but she doesn't know that I'm going to go get it when it's complete and that will be the day I surprise her with everything. So, I will absolutely keep everyone posted as to how things go!
Now, here is the image that I used for the final program, I decided to take @Vince_SAS advice, and have everything obfuscated, even the name of the final .gif output, and the image name. The image name I use within the program is "image1jpg"
Here is the final SAS code that will be used, I love how this works using the hex to hide the message!
ods _all_ close;
title;
footnote;
data work.words;
input line $hex40.;
datalines;
436872697374696E612C206D79206C6F76652C20
57696C6C20202020202020202020202020202020
596F752020202020202020202020202020202020
4D61727279202020202020202020202020202020
4D653F2020202020202020202020202020202020
;
run;
data work.message(drop=i line inc max);
length draw $ 20;
set words;
x = 5; inc = 2.0; max = 11;
do i = 1 to length(line);
order + 1; y = max;
do j = 1 to _n_ - 1;
set work.words(rename=(line=draw)) point=j; y + -inc; k + 1; output;
end;
draw = substr(line, 1, i);
y = max - _n_ * inc;
k + 1; output;
end;
call symputx('MAXORDER', order);
run;
data _null_;
set work.message(where=(order=&maxorder)) nobs=n1;
call symputx('MINO', k);
call symputx('MAXO', n1);
stop;
run;
data work.message(drop=j k); /* Pause */
set work.message end=eof;
output;
if eof then do j = 1 to 5;
do i = &MINO to &MAXO;
set work.message point=i;
order + j;
output;
end;
end;
run;
data work.annoImage;
function = 'image';
height = 100;
width = 100;
drawspace = 'GraphPercent';
image = '/folders/myfolders/image1jpg.jpg';
layer = 'back';
run;
options papersize=('10 in', '9 in') printerpath=gif animation=start
animduration=.3 animloop=1 noanimoverlay nonumber nodate nobyline;
ods printer file='/folders/myfolders/sasdemo1.gif';
ods graphics / width=10in height=9in imagefmt=gif;
proc sgplot data=message nowall noborder noautolegend sganno=annoimage;
by order;
text x=x y=y text=draw / textattrs=(size=38 weight=bold color=white style=italic);
xaxis values=(0 to 10) min=0 max=10 display=none;
yaxis values=(0 to 10) min=0 max=10 display=none;
run; quit;
options animation=stop byline;
ods printer close;
Now it's just a matter of time until I get the call that her ring is complete!
Once again, thank you everyone for ALL of the support, insight, and help that I've received here! Truly an awe-inspiring experience! 😄
-Brandon
Editor's note: some readers have been curious about the final product of the program. While not an exact replica of the proposal image that this program creates, we've created a generic version of the output that should give you a pretty good idea of how it comes across. Imagine clicking the little "running man" icon and then seeing this pop up!
... View more