mirror of
git://projects.qi-hardware.com/fped.git
synced 2024-12-22 23:14:36 +02:00
- when displaying loop iterations, we now use the active count, not just the
last count - loop iterations now show the actual value, not the zero-based iteration number - gui.html: added a GUI manual (in progress) git-svn-id: http://svn.openmoko.org/trunk/eda/fped@5531 99fdad57-331a-0410-800a-d7fa5415bdb3
This commit is contained in:
parent
63e60182bb
commit
d9b7ad94ec
13
Makefile
13
Makefile
@ -12,6 +12,8 @@
|
||||
|
||||
PREFIX = /usr/local
|
||||
|
||||
UPLOAD = werner@sita.openmoko.org:public_html/fped/
|
||||
|
||||
OBJS = fped.o expr.o coord.o obj.o delete.o inst.o util.o error.o \
|
||||
unparse.o file.o dump.o kicad.o postscript.o meas.o \
|
||||
cpp.o lex.yy.o y.tab.o \
|
||||
@ -25,6 +27,8 @@ XPMS = point.xpm delete.xpm delete_off.xpm \
|
||||
stuff.xpm stuff_off.xpm meas_off.xpm \
|
||||
bright.xpm bright_off.xpm all.xpm all_off.xpm
|
||||
|
||||
PNGS = intro-1.png intro-2.png intro-3.png intro-4.png intro-5.png intro-6.png
|
||||
|
||||
SHELL = /bin/bash
|
||||
CFLAGS_GTK = `pkg-config --cflags gtk+-2.0`
|
||||
LIBS_GTK = `pkg-config --libs gtk+-2.0`
|
||||
@ -71,7 +75,7 @@ endif
|
||||
|
||||
# ----- Rules -----------------------------------------------------------------
|
||||
|
||||
.PHONY: all dep depend clean install uninstall
|
||||
.PHONY: all dep depend clean install uninstall upload-manual
|
||||
|
||||
.SUFFIXES: .fig .xpm
|
||||
|
||||
@ -102,6 +106,13 @@ y.tab.o: y.tab.c
|
||||
|
||||
gui_tool.o gui.o: $(XPMS:%=icons/%)
|
||||
|
||||
# ----- Upload the GUI manual -------------------------------------------------
|
||||
|
||||
upload-manual: $(XPMS:%=icons/%)
|
||||
scp gui.html README $(UPLOAD)/
|
||||
scp $(XPMS:%=icons/%) $(UPLOAD)/icons/
|
||||
scp $(PNGS:%=screens/%) $(UPLOAD)/screens/
|
||||
|
||||
# ----- Dependencies ----------------------------------------------------------
|
||||
|
||||
dep depend .depend: lex.yy.c y.tab.h y.tab.c
|
||||
|
235
gui.html
Normal file
235
gui.html
Normal file
@ -0,0 +1,235 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>Fped GUI Manual</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<H1>Fped GUI Manual</H1>
|
||||
|
||||
This manual introduces the basic concepts of Fped and explains the elements
|
||||
of the graphical user interface. Please refer to the file
|
||||
<A href="README">README</A> for more
|
||||
technical details and a discussion of the scripting language used by fped.
|
||||
|
||||
|
||||
<H1>Objects and instances</H1>
|
||||
|
||||
Footprints tend to be highly repetitive, with many pads placed in a
|
||||
simple geometrical pattern. With fped, the user specifies the elements
|
||||
to repeat and the way they are repeated. Fped then generates the
|
||||
repetitions automatically.
|
||||
<P>
|
||||
Here is a simple example:
|
||||
<UL>
|
||||
<LI> Start fped without a command-line argument.
|
||||
<LI> Right-click on the yellow field that says "(root)" and select
|
||||
"Add loop". An entry saying "_ = 0 ... 0 (0)" appears next to the
|
||||
yellow field.
|
||||
<P><IMG src="screens/intro-1.png">
|
||||
<LI> Click on the underscore, type <B>n=1,5</B> and press Enter.
|
||||
The entry should now show "n = 1 ... 5 (1 2 3 4 5)"
|
||||
<P><IMG src="screens/intro-2.png">
|
||||
<LI> Click on the dark-yellow vector icon on the right-hand side.
|
||||
A red frame shows that it is selected.
|
||||
<LI> Move the mouse pointer to the green dot in the middle of the
|
||||
black canvas. A red circle appears when the pointer is over the
|
||||
dot.
|
||||
<LI> Press the left mouse button, drag a little to the right, and
|
||||
release the mouse button. A white line appears and changes
|
||||
to dark yellow after the button is released.
|
||||
<LI> Click on the yellow line. It is now shown in bright yellow and
|
||||
a number of text entry fields appear below the canvas.
|
||||
<P><IMG src="screens/intro-3.png">
|
||||
<LI> Click into the field on the top that probably says "0.1mm",
|
||||
change it to <B>n*1mm</B> and press Enter.
|
||||
<LI> Select "Zoom all" from the "View" drop-down menu. The canvas
|
||||
should now show the green dot on the left, with a yellow arrow
|
||||
pointing to the right, and four more even darker arrows following
|
||||
that arrow.
|
||||
<P><IMG src="screens/intro-4.png">
|
||||
<LI> Click on the icon depicting a light-blue circle.
|
||||
<LI> Move the mouse pointer over the green dot, then drag to the
|
||||
circle at the end of the vector, and release the mouse button.
|
||||
A series of partial circles should appear.
|
||||
<P><IMG src="screens/intro-5.png">
|
||||
<LI> Select "Zoom all" again to show the full circles.
|
||||
<P><IMG src="screens/intro-6.png">
|
||||
</UL>
|
||||
The graphical items you have entered are a vector and a circle with the
|
||||
radius determined by the vector. We call these items "objects". Furthermore,
|
||||
you have defined a variable that gets set to the values from 1 to 5, in
|
||||
increments of one. Fped had repeatedly drawn the objects for each such
|
||||
value. We call the item that have been drawn "instances".
|
||||
<P>
|
||||
The innermost vector and circle are highlighted. You can highlight other
|
||||
instances of the same objects by clicking on the numbers (1 2 3 4 5) shown
|
||||
next to the loop.
|
||||
|
||||
|
||||
<H1>Frames</H1>
|
||||
|
||||
Frames serve various purposes:
|
||||
<UL>
|
||||
<LI> To structure the footprint drawing by grouping like elements.
|
||||
For example, one may want to place pads, outline, and the keep-out
|
||||
area in different frames, and probably subdivide some of those
|
||||
constructs even further.
|
||||
<LI> To define an element that is used in several places. For example,
|
||||
a pad.
|
||||
<LI> To define a repetition through a loop or a table.
|
||||
<LI> To set variables for child frames.
|
||||
</UL
|
||||
|
||||
|
||||
<H1>Variables</H1>
|
||||
|
||||
|
||||
<H1>Iconography</H1>
|
||||
|
||||
The right-hand side of the fped window shows the component being drawn on a
|
||||
black background. We call this the canvas. It is surrounded by a toolbar on
|
||||
the right side and a few buttons with visibility options at the top.
|
||||
|
||||
|
||||
<H2>The canvas</H2>
|
||||
|
||||
|
||||
<H2>Blue screen</H2>
|
||||
|
||||
When an expression uses an unknown variable or evaluates to an incorrect
|
||||
value (e.g., a bare number where a dimension is expected), the
|
||||
instantiation fails. Fped indicates this by changing the background color
|
||||
of the canvas from black to blue. The cause of the failure is explained
|
||||
in the status bar at the bottom.
|
||||
<P>
|
||||
In this state, the canvas is no longer updated when making changes until
|
||||
the problem has been resolved. The most common causes are a misspelt
|
||||
variable name in an expression, the use of a number without unit where a
|
||||
dimension is expected, or the removal of a variable that's still used
|
||||
somewhere.
|
||||
<P>
|
||||
If the location of the error is not obvious, the list of objects can be
|
||||
shown by selecting "Swap var&code" from the View menu. The object
|
||||
in which the error occurred is shown in red. If the error occurred in a
|
||||
loop variable, the variable name is shown in red.
|
||||
|
||||
|
||||
<H2>Visibility options</H2>
|
||||
|
||||
When working on a complex component, the number of elements shown can be
|
||||
overwhelming. The visibility options help to quickly hide irrelevant
|
||||
details and get one's bearings. They are located in the menu bar at the
|
||||
top.
|
||||
<DL>
|
||||
<DT><IMG src="icons/all.xpm"> <IMG src="icons/all_off.xpm">
|
||||
<DD>Show all frames. If disabled, only show the currently active frame.
|
||||
<DT><IMG src="icons/stuff.xpm"> <IMG src="icons/stuff_off.xpm">
|
||||
<DD>Show vectors and frames.
|
||||
<DT><IMG src="icons/meas.xpm"> <IMG src="icons/meas_off.xpm">
|
||||
<DD>Show measurements.
|
||||
<DT><IMG src="icons/bright.xpm"> <IMG src="icons/bright_off.xpm">
|
||||
<DD>Highlight the elements that will be exported to KiCad, i.e.,
|
||||
the pads and the silk screen drawings. To show the component
|
||||
exactly as it will appear in KiCad, also turn off vectors,
|
||||
frames, and measurements.
|
||||
</DL>
|
||||
The visibility options can be combined.
|
||||
|
||||
|
||||
<H2>Tools</H2>
|
||||
|
||||
Tools are used to add new elements and to manipulate existing ones.
|
||||
<DL>
|
||||
<DT><IMG src="icons/point.xpm">
|
||||
<DD> The pointer. This is the default tool. The pointer is used to
|
||||
select items and do move points of the selected item.
|
||||
<P>
|
||||
To move points, select the item, then move the mouse pointer over
|
||||
the point to move. A red circle will appear under the mouse pointer.
|
||||
Then drag the point to its new location and release the mouse button.
|
||||
<DT><IMG src="icons/delete.xpm"> <IMG src="icons/delete_off.xpm">
|
||||
<DD> Delete the currently selected item. Whenever an item is selected,
|
||||
the delete icon lights up. Clicking the icon deletes the item.
|
||||
To undelete the item, press <B>U</B>.
|
||||
<DT><IMG src="icons/vec.xpm">
|
||||
<DD> Add a vector. To add a new vector, move the mouse pointer to the
|
||||
new vector's starting point then drag towards the desired end point.
|
||||
Vectors are normally specified via parameters. To enter the parameters,
|
||||
click on the new vector.
|
||||
<P>
|
||||
Note that the starting point of the vector has to be in the same
|
||||
frame as the vector being drawn. This limitation also applies to
|
||||
points defining pads and silk-screen items.
|
||||
<DT><IMG src="icons/frame.xpm"> <IMG src="icons/frame_locked.xpm">
|
||||
<IMG src="icons/frame_ready.xpm">
|
||||
<DD> Add a frame reference. A frame reference inserts the content of a
|
||||
frame into another frame. There are three steps in this process:
|
||||
<UL>
|
||||
<LI> Select the frame to be inserted and click on the frame icon.
|
||||
A large black dot appears in the icon to indicate that a frame
|
||||
reference has been chosen.
|
||||
<LI> Select the frame into which to insert the reference. The dot
|
||||
changes to green to indicate that the reference can now be placed.
|
||||
If the dot stays black, then the selected frame is not a valid
|
||||
destination, i.e., because the reference in turn references this
|
||||
frame.
|
||||
<LI> Click on the location at which to attach the reference. This
|
||||
location can be either the end of a vector or the frame's origin.
|
||||
</UL>
|
||||
When finished, don't forget that the destination frame is still selected.
|
||||
In order to add elements to the newly referenced frame, you have to
|
||||
select it first.
|
||||
<DT><IMG src="icons/pad.xpm"> <IMG src="icons/rpad.xpm">
|
||||
<DD> Add a pad. Pads are either rectangular or rounded. They are
|
||||
defined by two points which are opposite corners of the rectangle
|
||||
containing the pad. Move the mouse cursor to the first point, then
|
||||
drag to the second point. The pad's name can be edited after selecting
|
||||
the pad.
|
||||
<DT><IMG src="icons/line.xpm"> <IMG src="icons/rect.xpm">
|
||||
<DD> Add a line or a rectangle. Similar to pads, lines and rectangles
|
||||
are defined by two points. The width of the line can be edited after
|
||||
selecting the line or rectangle.
|
||||
<DT><IMG src="icons/circ.xpm">
|
||||
<DD> Add circle or arc. Circles are defined by their center end a
|
||||
point at their radius. An arc has a third point, which defines the
|
||||
angle at which the arc ends. If this third point is not located on
|
||||
the radius, the arc ends where an imaginary line between the center
|
||||
and the end point would intersect with the radius.
|
||||
<P>
|
||||
An arc is made by first drawing a circle with the radius point at
|
||||
the location where the arc should start. Then click and hold the
|
||||
radius point to drag the end point to the desired location.
|
||||
<P>
|
||||
To change the radius point of a circle, first drag the end point,
|
||||
then drag the radius point itself to that same location.
|
||||
<DT><IMG src="icons/meas.xpm"> <IMG src="icons/meas_x.xpm">
|
||||
<IMG src="icons/meas_y.xpm">
|
||||
<DD> Add a measurement. Measurements show the distance between points.
|
||||
They can either measure diagonally or only horizontally or only vertically.
|
||||
Unlike other items, measurements are not limited to points in the same
|
||||
frame. Instead, they operate on the minimum, maximum, and next greater
|
||||
coordinates of instances of objects.
|
||||
<P>
|
||||
A measurement is added as follows:
|
||||
<UL>
|
||||
<LI> Click on one of the three measurement icons to select the
|
||||
measurement type. All possible endpoints are highlighted.
|
||||
<LI> Drag from the desired starting point. Now all the endpoints
|
||||
available for this starting point are highlighted.
|
||||
<LI> Drag to the endpoint and release the mouse button. The measurement
|
||||
will now appear as a double-headed arrow and text between the two
|
||||
points (if this is a diagonal measurement) or extending vertically or
|
||||
horizontally from one of the two points.
|
||||
<LI> To move the measurement arrow away from the two points, select
|
||||
the measurement and set an offset.
|
||||
</UL>
|
||||
Sometimes, the second point becomes unavailable after selecting the
|
||||
first point. This means that the two points are not a minimum or maximum,
|
||||
or a minimum and the next greater neighbour. In this case, just try
|
||||
another pair of points measuring the same distance.
|
||||
</DL>
|
||||
|
||||
|
||||
<H1>Keyboard shortcuts</H1>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
@ -1013,7 +1013,7 @@ static void build_loop(GtkWidget *vbox, struct frame *frame,
|
||||
|
||||
for (i = 0; i != loop->iterations; i++) {
|
||||
label = add_activator(hbox, loop->active == i,
|
||||
loop_select_event, loop, "%d", i);
|
||||
loop_select_event, loop, "%g", loop->n+i);
|
||||
gtk_object_set_data(GTK_OBJECT(box_of_label(label)), "value",
|
||||
(gpointer) (long) i);
|
||||
|
||||
|
17
obj.c
17
obj.c
@ -238,7 +238,10 @@ static int run_loops(struct frame *frame, struct loop *loop,
|
||||
n++;
|
||||
}
|
||||
loop->initialized = 0;
|
||||
loop->iterations = n;
|
||||
if (active) {
|
||||
loop->n = from.n;
|
||||
loop->iterations = n;
|
||||
}
|
||||
return 1;
|
||||
|
||||
fail:
|
||||
@ -279,6 +282,17 @@ static int generate_frame(struct frame *frame, struct coord base,
|
||||
}
|
||||
|
||||
|
||||
static void reset_all_loops(void)
|
||||
{
|
||||
const struct frame *frame;
|
||||
struct loop *loop;
|
||||
|
||||
for (frame = frames; frame; frame = frame->next)
|
||||
for (loop = frame->loops; loop; loop = loop->next)
|
||||
loop->iterations = 0;
|
||||
}
|
||||
|
||||
|
||||
int instantiate(void)
|
||||
{
|
||||
struct coord zero = { 0, 0 };
|
||||
@ -287,6 +301,7 @@ int instantiate(void)
|
||||
meas_start();
|
||||
inst_start();
|
||||
instantiation_error = NULL;
|
||||
reset_all_loops();
|
||||
ok = generate_frame(root_frame, zero, NULL, NULL, 1);
|
||||
if (ok)
|
||||
ok = instantiate_meas();
|
||||
|
1
obj.h
1
obj.h
@ -79,6 +79,7 @@ struct loop {
|
||||
|
||||
/* GUI use */
|
||||
int active; /* n-th iteration is active, 0 based */
|
||||
double n; /* start value when it was active */
|
||||
int iterations; /* iterations when it was active */
|
||||
|
||||
/* for evaluation */
|
||||
|
BIN
screens/intro-1.png
Normal file
BIN
screens/intro-1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.5 KiB |
BIN
screens/intro-2.png
Normal file
BIN
screens/intro-2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.4 KiB |
BIN
screens/intro-3.png
Normal file
BIN
screens/intro-3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.6 KiB |
BIN
screens/intro-4.png
Normal file
BIN
screens/intro-4.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 461 B |
BIN
screens/intro-5.png
Normal file
BIN
screens/intro-5.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
BIN
screens/intro-6.png
Normal file
BIN
screens/intro-6.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 19 KiB |
Loading…
Reference in New Issue
Block a user