Through the Interface: Implementing an AutoCAD command to print graphics to the screen using .NET

Kean Walmsley

May 2015

Sun Mon Tue Wed Thu Fri Sat
          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 27 28 29 30


« Moving on (and yet not) | Main | Finding out when a custom PaletteSet is closed in AutoCAD using .NET »

December 19, 2011

Implementing an AutoCAD command to print graphics to the screen using .NET

This recent request came into my inbox from our discussion group support team:

I know that this is not strictly an AutoCAD 2012 issue, BUT as her CAD teacher it’s my job to do the best I can for all of my students so I’m reaching out and asking for help.

I have a severely disabled student; she can only move her head (and that is severely limited). She has a head mouse to point with. She can left and right click her mouse by using a puffer tube in her mouth. But she can’t scroll or pan easily, (Center mouse wheel something easy for us). I have enlarged the icons, enlarged the text, high contrast background, moved the command line up to the ribbon, and she uses an onscreen keyboard (the default keyboard that comes with windows). But inputting numbers, zooming and panning is very hard; even with icons it is painfully slow. Note this is a main streamed student, who is at peer level. She has a full time nurse and aid to help her.

I have a second monitor mounted close to me so I can see what she is doing, but I don’t have an easy way for her to signal me when she needs help. Anyone know how to write a lisp program to flash a red square to catch my attention?

This is an interesting request, and one whose solution I have to believe would be helpful to others in similar situations (as well as to those who just have an interest in the chosen approach).

There were a couple of ways that stood out, in terms of addressing this requirement:

  1. One using AutoCAD transient graphics to display text on AutoCAD’s drawing canvas
  2. One painting graphics directly to the screen, not using an AutoCAD-specific API

I opted for the second approach, as I considered it would be of more potential use for products other than AutoCAD. It creates an empty, transparent form the size of the screen which paints a red border around itself and some simple text centered on it. The form flashes on and off five times (although it could very easily be displayed indefinitely, too).

Here’s the C# code:

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.Runtime;

using System.Drawing;

using System.Windows.Forms;

using System;


namespace GetAttention


  public class HelpForm : Form


    // Percentage of screen height for border


    const int bdrPrc = 20;

    const string msg = "Help!";


    public HelpForm()


      TopMost = true;

      ShowInTaskbar = false;

      FormBorderStyle = FormBorderStyle.None;

      BackColor = Color.Plum;

      TransparencyKey = Color.Plum;

      Width = Screen.PrimaryScreen.Bounds.Width;

      Height = Screen.PrimaryScreen.Bounds.Height;


      Paint += new PaintEventHandler(HelpForm_Paint);



    void HelpForm_Paint(object sender, PaintEventArgs e)


      // Calculate the actual border size in pixels


      int bdrWid = Height * bdrPrc / 100;


      // Our border will be around the whole screen


      Rectangle border = new Rectangle(0, 0, Width, Height);


      // Draw the border



        new Pen(Brushes.Red, bdrWid), border



      // Our text will be centered in the border


      System.Drawing.Font f = new Font("Arial", bdrWid);


      SizeF sz = e.Graphics.MeasureString(msg, f);

      int wid = (int)sz.Width;

      int hgt = (int)sz.Height;

      Rectangle rect =

        new Rectangle(

          (Width - wid) / 2, (Height - hgt) / 2,

          (int)(wid * 1.2), hgt


      e.Graphics.DrawString(msg, f, Brushes.Red, rect);




  public class Commands


    private HelpForm _form = null;

    private Timer _timer = null;

    private int _times = 0;


    void Timer_Tick(object sender, EventArgs e)


      // Once the timer has ticked 10 times (and the form

      // displayed 5 times), dispose of the form


      if (_times++ >= 10)




        _form = null;




        _timer = null;


        _times = 0;




        // If we haven't reached ten ticks, toggle the form's

        // display on/off


        if (_form.Visible)








    public void RequestHelp()


      // Create our form


      _form = new HelpForm();



      // Start the timer, ticking once per second


      _timer = new Timer() { Interval = 1000, Enabled = true };

      _timer.Tick += new EventHandler(Timer_Tick);




Here are the results of running the HELPME command:

Asking for help

blog comments powered by Disqus


10 Random Posts