BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
Obsidian | Level 7

Yep, just tried that, and got everything how I want it. 😄

Rhodochrosite | Level 12

I am absolutely fine with you using it!  I have been out on a hike so I missed most of the dialogue today.


Here is a blog I wrote  using basically the same code.  I "pause" it by repeating some of the frames.  I can help you with that if it is not clear.


Best wishes!

Obsidian | Level 7


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;


data work.words;
input line $hex40.;

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;
  draw = substr(line, 1, i);
  y = max - _n_ * inc;
  k + 1; output;
call symputx('MAXORDER', order);

data _null_;
set work.message(where=(order=&maxorder)) nobs=n1;
call symputx('MINO', k);
call symputx('MAXO', n1);

data work.message(drop=j k); /* Pause */
set work.message end=eof;
if eof then do j = 1 to 5;
  do i = &MINO to &MAXO; 
    set work.message point=i; 
    order + j; 

data work.annoImage;
function  = 'image'; 
height    = 100; 
width     = 100; 
drawspace = 'GraphPercent';
image     = '/folders/myfolders/image1jpg.jpg'; 
layer     = 'back';

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! 😄




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!



Rhodochrosite | Level 12

I am sure I speak for everyone at SAS Communities, when I saw that we are so glad we could help!  I saw  Chris,  Vince, and Bev this week, and we are all excited about this!
Best wishes!


Rhodochrosite | Level 12

You did a great job of digesting a ton of information and pulling it all together!


@ShelleySessoms can look into the possibility of marking multiple posts as solutions.  It that's not possible, then you can create a new post with permalinks to what you consider to be the solutions, and then mark that post as the solution.


You've discovered something that many of us take for granted: the SAS development and user community is filled with extraordinary people.


I'm glad that I was able to help with this project, and we anxiously await the rest of the story.


And the new posting asking for help using the SAS RWI to create your wedding invitations...


Vince DelGobbo





Community Manager

What@Vince_SAS said: Lots of amazing people in here! @grandpastyle13: At your convenience, you can post one comment that encapsulates the tips you used and tag the contributors. When you mark that one as the accepted solution, everyone tagged accrues credit.


Can't wait till you pop the question!


/* rose picture*/
ods graphics/reset=all;
ods graphics/ imagefmt=png;
options device=png;

options nodate nonumber;

*ods graphics/ height=6.5in noborder;
ods pdf gtitle gfootnote
	 startpage=no ;
%macro makecard(for=@grandpastyle13,from=SAS Community Managers);

	data Roses;
		/* the array below has a list of multipliers that make 
		pretty roses, it is temporary, so will not be saved
		with the data*/
		array klist{11} _temporary_ (4, 5, 6, 1.5, 2.5, 1.333333, 2.33333, .75, 1.25, 1.2, .8333333);

		do flower=1 to 12;
			n = ceil( 11*rand("Uniform") );

			/*pick a random number
			between 1 and 11*/
			k=klist{n}; /*assign k to be the nth multiplier*/

			/* draw the rose r=cos(k * theta) */
			do theta = 0 to 12*constant("pi") by 0.1;
				r = cos(k * theta);      /* generalized rose */
				x = r*cos(theta);        /* convert to Euclidean coords */
				y = r*sin(theta);

				/*move the rose to the right spot*/
				if flower <= 5 then
				else if 6<= flower<=9 then
				else if 10<= flower<=12 then


				/*make the stem*/

		do theta = constant("pi")*7.5/12 to constant("pi")*28.5/12 by 0.01;
			r = cos(2 * (theta));       /* rose */
			x = r*cos(theta);          /* convert to Euclidean coords */
			y = r*sin(theta);

			if y<abs(x) then

	proc sort data=roses;
		by group;
		title1 "Good luck, @grandpastyle13!" ;
		title2 "(These random polar roses will keep till you propose. ;-)" ;

	proc sgplot data=Roses aspect=1 noautolegend
			noborder nowall;
		styleattrs datacontrastcolors=
			green green green green
			green green green green
			green green green green
			red  bippk red purple bippk 
			blue purple  bippk red purple  blue red
				) datalinepatterns=(1);
		series x=x y=y /group=group;
		xaxis min=0 max=15 display=none;
		yaxis min=0 max=15 display=none;
		footnote "Best wishes, &from";
		footnote2 " ";
		footnote3 " ";
		footnote4 " ";
		footnote5 " Polar Roses: r = cos(k*theta)";
		footnote6 " Generated with the SAS System 9.4";


    %makecard(for=@grandpastyle13,from=Your SAS Community Managers);

ods pdf close;



Couldn't attend SAS Innovate in person? We gotchu. Access on-demand content now!

Rhodochrosite | Level 12

If anyone is interested, I took basically the same code that I provided Brandon, changed the background and the words, and sped up the animation to make this blog:


Obsidian | Level 7

Good morning everyone! 😄


So... I have some news!


We are now engaged!!! 😄 😄 


I got the call yesterday afternoon at work that her ring was completed (it was finished 3 weeks earlier than expected!), so I went and got it right away. When I got home, I told her I wanted her to see what I'd been working on with SAS.


I had her look at the code, and then run it on my computer. I then told her to open up the .gif output within SAS. I was knelt next to her as I was having her do this... She didn't suspect a thing! 😉


When the image loaded up, and the text started writing, her jaw dropped. She was in complete disbelief. She said multiple times that she was completely in shock and couldn't believe I had thought to do it that way. She absolutely loved it! 


Everything worked out perfectly, and she was totally floored by the entire thing... Exactly how I wanted it to be! 😄


I emailed her the image and code that I used, and also the final .gif output from SAS (one great that about the final output is that is something she and I will have forever now! :D). She told me "You do know that I have to show this to my professor and tell him you did this... He's not going to believe it!" I told her that of course, I'm fine with that. 🙂


I just wanted to say thank you SO VERY MUCH again to everyone that was involved and helped me out. It truly was perfect, and happened just the way I intended it to! 😄


Forever grateful,




Community Manager

CONGRATULATIONS @grandpastyle13! This SAS program is definitely one for the books.

It's time to register for SAS Innovate! Join your SAS user peers in Las Vegas on April 16-19 2024.
Community Manager

Congratulations, @grandpastyle13! So happy the community could participate in your big day!


It's time to register for SAS Innovate! Join your SAS user peers in Las Vegas on April 16-19 2024.
Rhodochrosite | Level 12

That is such great news, and awesome timing ... right before the holidays!




Vince DelGobbo


SAS Employee

Congratulations!! I've been anxiously waiting for this announcement!! So happy for you both!


Community Manager

I'm SO HAPPY for you @grandpastyle13! I've been watching this thread eagerly awaiting the outcome. It's a SAS fairy tale come to life! Congratulations!!!

Rhodochrosite | Level 12


Awesome!  Congratulations to you!  Best wishes to the bride!  This is wonderful!

Barite | Level 11

Wow!! Congratulation...

I was eagerly waiting for the result. 

Great news 🙂 


Don't miss out on SAS Innovate - Register now for the FREE Livestream!

Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.


Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats