Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Controlling scale of Graphics on paper

379 views
Skip to first unread message

Joseph Gwinn

unread,
Apr 21, 2012, 12:32:50 AM4/21/12
to
I would like to use Mathematica to make printed templates of various
kinds.

In one use, a complicated shape is generated mathematically and
displayed using Graphics or Show, the plot is printed on paper, the
paper is glued to a piece of wood, which is cut and drilled to the lines
and center-points. This requires the ability to control the on-paper
scale factor, so that a length of 1.0 in a line ends up being one inch
(or one centimeter) on paper.

I assume that this is possible, but have not found anything relevant in
the online documentation. What I have done is used Mathematica to make
dolls of machine parts; in this case it was sufficient that all be in
the same scale, which was achieved using ImageSize->72*6 directives, but
ImageSize doesn't speak directly to the issue of scale on paper.

It may be that ImageSize->{w,h} can be used, but there is some math
required.

So, my question is how best to achieve a specified scale on paper.

TIA,

Joe Gwinn

Yves Klett

unread,
Apr 23, 2012, 5:43:54 AM4/23/12
to
No guarantuees, but I used something like:

ExportScaled[filename_,gfx_,format_:{210,297},opts___?OptionQ]:=Module[{mm},
mm=72/25.4;
Export[filename,Show[gfx,ImageSize->format*mm,ImageMargins->0,ImagePadding->None,AspectRatio->Automatic],opts]
]


with good success together with PDF and EPS export formats (i.e.
filenames of the "xxx.pdf" kind). Note that the scaling factor is set to
generate 1mm units. The default "format" is set to Din A4.

Regards,
Yves

Yves Klett

unread,
Apr 24, 2012, 5:32:06 AM4/24/12
to
Addendum to my first post:

This does only work properly if the PlotRange of the graphics object is
set to reflect the values of "format" (had not used that one in a while).

So making sure your dimensions are correct by using ghostview is always
a good idea ;-)

So the right way to use this is:

gfx = Graphics[Line[{{10, 10}, {110, 10}, {110, 110}}],
PlotRange -> {{0, 200}, {0, 200}}]

ExportScaled[filename_, gfx_, format_: {210, 297}, opts___?OptionQ] :=
Module[{mm}, mm = 72/25.4;
Export[filename,
Show[gfx, ImageSize -> format*mm, ImageMargins -> 0,
ImagePadding -> None, AspectRatio -> Automatic], opts]]

ExportScaled["test.eps", gfx, -Subtract @@@ (PlotRange /.
Options[gfx, PlotRange])]

It is a good idea to set the PlotRange values for your graphics object
*explicitely*, because extracting the with FullOptions can result in
added whitespace (at least in some cases).

Regards,
Yves

Joseph Gwinn

unread,
Apr 26, 2012, 5:27:13 AM4/26/12
to
In article <jn5rum$nr4$1...@smc.vnet.net>,
Yves Klett <yves....@googlemail.com> wrote:

> Addendum to my first post:
>
> This does only work properly if the PlotRange of the graphics object is
> set to reflect the values of "format" (had not used that one in a while).
>
> So making sure your dimensions are correct by using ghostview is always
> a good idea ;-)
>
> So the right way to use this is:
>
> gfx = Graphics[Line[{{10, 10}, {110, 10}, {110, 110}}],
> PlotRange -> {{0, 200}, {0, 200}}]
>
> ExportScaled[filename_, gfx_, format_: {210, 297}, opts___?OptionQ] :=
> Module[{mm}, mm = 72/25.4;
> Export[filename,
> Show[gfx, ImageSize -> format*mm, ImageMargins -> 0,
> ImagePadding -> None, AspectRatio -> Automatic], opts]]
>
> ExportScaled["test.eps", gfx, -Subtract @@@ (PlotRange /.
> Options[gfx, PlotRange])]
>
> It is a good idea to set the PlotRange values for your graphics object
> *explicitly*, because extracting the with FullOptions can result in
> added whitespace (at least in some cases).

So, it is necessary to set five things in a self-consistent manner to
achieve the desired scale control. I had guessed that three things were
needed.

I'll be trying this.

Thanks,

Joe Gwinn

Szabolcs Horvát

unread,
Apr 27, 2012, 6:52:40 AM4/27/12
to
You got several suggestions. One thing that hasn't been mentioned yet
is exporting to DXF.

DXF is a CAD-specific format, so there's support for printing to exact
scales. First export to DXF, then open it with a CAD program or a DXF
viewer and print to a precise scale. I think this will fit your
application best.

If you are going to go the PDF route, this might be valuable (similar to
other suggestions):

http://mathematica.stackexchange.com/a/750/12

You'll need to get rid of any PlotRangePadding and ImageMargins too, if
you choose this route.


--
Szabolcs Horvát
Visit Mathematica.SE: http://mathematica.stackexchange.com/

Joseph Gwinn

unread,
Apr 29, 2012, 2:14:14 AM4/29/12
to
In article <jndtpo$jm0$1...@smc.vnet.net>,
Hmm. I do have a CAD program (Alibre), and it does understand DXF (of
course), but that's a whole new world.

I was hoping for a simpler solution, in Mathematica only, for
non-precision and one-off applications. One would hope and assume that
Mathematica can do this natively.

But it's a good idea nonetheless, for more complex jobs.

Joe Gwinn

0 new messages