mirror of https://github.com/Desuuuu/klipper.git
docs: Update documentation with iterative solver changes
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
parent
926829e737
commit
3ac9fc6e63
|
@ -163,28 +163,37 @@ provides further information on the mechanics of moves.
|
||||||
kinematic class is given a chance to audit the move
|
kinematic class is given a chance to audit the move
|
||||||
(`ToolHead.move() -> kin.check_move()`) before it goes on the
|
(`ToolHead.move() -> kin.check_move()`) before it goes on the
|
||||||
look-ahead queue, but once the move arrives in *kin*.move() the
|
look-ahead queue, but once the move arrives in *kin*.move() the
|
||||||
kinematic class is required to handle the move as specified. The
|
kinematic class is required to handle the move as specified. Note
|
||||||
kinematic classes translate the three parts of each move
|
that the extruder is handled in its own kinematic class. Since the
|
||||||
(acceleration, constant "cruising" velocity, and deceleration) to
|
Move() class specifies the exact movement time and since step pulses
|
||||||
the associated movement on each stepper. Note that the extruder is
|
are sent to the micro-controller with specific timing, stepper
|
||||||
handled in its own kinematic class. Since the Move() class specifies
|
movements produced by the extruder class will be in sync with head
|
||||||
the exact movement time and since step pulses are sent to the
|
movement even though the code is kept separate.
|
||||||
micro-controller with specific timing, stepper movements produced by
|
|
||||||
the extruder class will be in sync with head movement even though
|
|
||||||
the code is kept separate.
|
|
||||||
|
|
||||||
* For efficiency reasons, the stepper pulse times are generated in C
|
* Klipper uses an
|
||||||
code. The code flow is: `kin.move() -> MCU_Stepper.step_const() ->
|
[iterative solver](https://en.wikipedia.org/wiki/Root-finding_algorithm)
|
||||||
stepcompress_push_const()`, or for delta kinematics:
|
to generate the step times for each stepper. For efficiency reasons,
|
||||||
`DeltaKinematics.move() -> MCU_Stepper.step_delta() ->
|
the stepper pulse times are generated in C code. The code flow is:
|
||||||
stepcompress_push_delta()`. The MCU_Stepper code just performs unit
|
`kin.move() -> MCU_Stepper.step_itersolve() ->
|
||||||
and axis transformation (millimeters to step distances), and calls
|
itersolve_gen_steps()` (in klippy/chelper/itersolve.c). The goal of
|
||||||
the C code. The C code calculates the stepper step times for each
|
the iterative solver is to find step times given a formula that
|
||||||
movement and fills an array (struct stepcompress.queue) with the
|
calculates a stepper position from a given time in a move. This is
|
||||||
corresponding micro-controller clock counter times for every
|
done by repeatedly "guessing" various times until the stepper
|
||||||
step. Here the "micro-controller clock counter" value directly
|
position formula returns the desired position of the next step on
|
||||||
corresponds to the micro-controller's hardware counter - it is
|
the stepper. The feedback produced from each guess is used to
|
||||||
relative to when the micro-controller was last powered up.
|
improve future guesses so that the process rapidly converges to the
|
||||||
|
desired time. The kinematic stepper position formulas are located in
|
||||||
|
the klippy/chelper/ directory (eg, kin_cart.c, kin_corexy.c,
|
||||||
|
kin_delta.c, kin_extruder.c).
|
||||||
|
|
||||||
|
* After the iterative solver calculates the step times they are added
|
||||||
|
to an array: `itersolve_gen_steps() -> queue_append()` (in
|
||||||
|
klippy/chelper/stepcompress.c). The array (struct
|
||||||
|
stepcompress.queue) stores the corresponding micro-controller clock
|
||||||
|
counter times for every step. Here the "micro-controller clock
|
||||||
|
counter" value directly corresponds to the micro-controller's
|
||||||
|
hardware counter - it is relative to when the micro-controller was
|
||||||
|
last powered up.
|
||||||
|
|
||||||
* The next major step is to compress the steps: `stepcompress_flush()
|
* The next major step is to compress the steps: `stepcompress_flush()
|
||||||
-> compress_bisect_add()` (in klippy/chelper/stepcompress.c). This
|
-> compress_bisect_add()` (in klippy/chelper/stepcompress.c). This
|
||||||
|
@ -293,8 +302,7 @@ This section provides some tips on adding support to Klipper for
|
||||||
additional types of printer kinematics. This type of activity requires
|
additional types of printer kinematics. This type of activity requires
|
||||||
excellent understanding of the math formulas for the target
|
excellent understanding of the math formulas for the target
|
||||||
kinematics. It also requires software development skills - though one
|
kinematics. It also requires software development skills - though one
|
||||||
should only need to update the host software (which is written in
|
should only need to update the host software.
|
||||||
Python).
|
|
||||||
|
|
||||||
Useful steps:
|
Useful steps:
|
||||||
1. Start by studying the
|
1. Start by studying the
|
||||||
|
@ -304,74 +312,30 @@ Useful steps:
|
||||||
and delta.py. The kinematic classes are tasked with converting a
|
and delta.py. The kinematic classes are tasked with converting a
|
||||||
move in cartesian coordinates to the movement on each stepper. One
|
move in cartesian coordinates to the movement on each stepper. One
|
||||||
should be able to copy one of these files as a starting point.
|
should be able to copy one of these files as a starting point.
|
||||||
3. Implement the `get_postion()` method in the new kinematics
|
3. Implement the C stepper kinematic position functions for each
|
||||||
class. This method converts the current stepper position of each
|
stepper if they are not already available (see kin_cart.c,
|
||||||
stepper axis (stored in millimeters) to a position in cartesian
|
kin_corexy.c, and kin_delta.c in klippy/chelper/). The function
|
||||||
space (also in millimeters).
|
should call `move_get_coord()` to convert a given move time (in
|
||||||
4. Implement the `set_postion()` method. This is the inverse of
|
seconds) to a cartesian coordinate (in millimeters), and then
|
||||||
get_position() - it sets each axis position (in millimeters) given
|
calculate the desired stepper position (in millimeters) from that
|
||||||
a position in cartesian coordinates.
|
cartesian coordinate.
|
||||||
5. Implement the `move()` method. The goal of the move() method is to
|
4. Implement the `set_position()` method in the python code. This also
|
||||||
convert a move defined in cartesian space to a series of stepper
|
calculates the desired stepper positions given a cartesian
|
||||||
step times that implement the requested movement.
|
coordinate.
|
||||||
* The `move()` method is passed a "print_time" parameter (which
|
5. Implement the `get_position()` method in the new kinematics
|
||||||
stores a time in seconds) and a "move" class instance that fully
|
class. This method is the inverse of set_position(). It does not
|
||||||
defines the movement. The goal is to repeatedly invoke the
|
need to be efficient as it is typically only called during homing
|
||||||
`stepper.step()` method with the time (relative to print_time)
|
and probing operations.
|
||||||
that each stepper should step at to obtain the desired motion.
|
6. Implement the `move()` method. This method generally invokes the
|
||||||
* One "trick" to help with the movement calculations is to imagine
|
iterative solver for each stepper.
|
||||||
there is a physical rail between `move.start_pos` and
|
7. Other methods. The `home()`, `check_move()`, and other methods
|
||||||
`move.end_pos` that confines the print head so that it can only
|
|
||||||
move along this straight line of motion. Then, if the head is
|
|
||||||
confined to that imaginary rail, the head is at `move.start_pos`,
|
|
||||||
only one stepper is enabled (all other steppers can move freely),
|
|
||||||
and the given stepper is stepped a single step, then one can
|
|
||||||
imagine that the head will move along the line of movement some
|
|
||||||
distance. Determine the formula converting this step distance to
|
|
||||||
distance along the line of movement. Once one has the distance
|
|
||||||
along the line of movement, one can figure out the time that the
|
|
||||||
head should be at that position (using the standard formulas for
|
|
||||||
velocity and acceleration). This time is the ideal step time for
|
|
||||||
the given stepper and it can be passed to the `stepper.step()`
|
|
||||||
method.
|
|
||||||
* The `stepper.step()` method must always be called with an
|
|
||||||
increasing time for a given stepper (steps must be scheduled in
|
|
||||||
the order they are to be executed). A common error during
|
|
||||||
kinematic development is to receive an "Internal error in
|
|
||||||
stepcompress" failure - this is generally due to the step()
|
|
||||||
method being invoked with a time earlier than the last scheduled
|
|
||||||
step. For example, if the last step in move1 is scheduled at a
|
|
||||||
time greater than the first step in move2 it will generally
|
|
||||||
result in the above error.
|
|
||||||
* Fractional steps. Be aware that a move request is given in
|
|
||||||
cartesian space and it is not confined to discreet
|
|
||||||
locations. Thus a move's start and end locations may translate to
|
|
||||||
a location on a stepper axis that is between two steps (a
|
|
||||||
fractional step). The code must handle this. The preferred
|
|
||||||
approach is to schedule the next step at the time a move would
|
|
||||||
position the stepper axis at least half way towards the next
|
|
||||||
possible step location. Incorrect handling of fractional steps is
|
|
||||||
a common cause of "Internal error in stepcompress" failures.
|
|
||||||
6. Other methods. The `home()`, `check_move()`, and other methods
|
|
||||||
should also be implemented. However, at the start of development
|
should also be implemented. However, at the start of development
|
||||||
one can use empty code here.
|
one can use empty code here.
|
||||||
7. Implement test cases. Create a g-code file with a series of moves
|
8. Implement test cases. Create a g-code file with a series of moves
|
||||||
that can test important cases for the given kinematics. Follow the
|
that can test important cases for the given kinematics. Follow the
|
||||||
[debugging documentation](Debugging.md) to convert this g-code file
|
[debugging documentation](Debugging.md) to convert this g-code file
|
||||||
to micro-controller commands. This is useful to exercise corner
|
to micro-controller commands. This is useful to exercise corner
|
||||||
cases and to check for regressions.
|
cases and to check for regressions.
|
||||||
8. Optimize if needed. One may notice that the existing kinematic
|
|
||||||
classes do not call `stepper.step()`. This is purely an
|
|
||||||
optimization - the inner loop of the kinematic calculations were
|
|
||||||
moved to C to reduce load on the host cpu. All of the existing
|
|
||||||
kinematic classes started development using `stepper.step()` and
|
|
||||||
then were later optimized. The g-code to mcu command translation
|
|
||||||
(described in the previous step) is a useful tool during
|
|
||||||
optimization - if a code change is purely an optimization then it
|
|
||||||
should not impact the resulting text representation of the mcu
|
|
||||||
commands (though minor changes in output due to floating point
|
|
||||||
rounding are possible). So, one can use this system to detect
|
|
||||||
regressions.
|
|
||||||
|
|
||||||
Time
|
Time
|
||||||
====
|
====
|
||||||
|
|
|
@ -139,15 +139,32 @@ tracked in millimeters, seconds, and in cartesian coordinate space.
|
||||||
It's the task of the kinematic classes to convert from this generic
|
It's the task of the kinematic classes to convert from this generic
|
||||||
coordinate system to the hardware specifics of the particular printer.
|
coordinate system to the hardware specifics of the particular printer.
|
||||||
|
|
||||||
In general, the code determines each step time by first calculating
|
Klipper uses an
|
||||||
where along the line of movement the head would be if a step is
|
[iterative solver](https://en.wikipedia.org/wiki/Root-finding_algorithm)
|
||||||
taken. It then calculates what time the head should be at that
|
to generate the step times for each stepper. The code contains the
|
||||||
position. Determining the time along the line of movement can be done
|
formulas to calculate the ideal cartesian coordinates of the head at
|
||||||
using the formulas for constant acceleration and constant velocity:
|
each moment in time, and it has the kinematic formulas to calculate
|
||||||
|
the ideal stepper positions based on those cartesian coordinates. With
|
||||||
|
these formulas, Klipper can determine the ideal time that the stepper
|
||||||
|
should be at each step position. The given steps are then scheduled at
|
||||||
|
these calculated times.
|
||||||
|
|
||||||
|
The key formula to determine how far a move should travel under
|
||||||
|
constant acceleration is:
|
||||||
```
|
```
|
||||||
time = sqrt(2*distance/accel + (start_velocity/accel)^2) - start_velocity/accel
|
move_distance = (start_velocity + .5 * accel * move_time) * move_time
|
||||||
time = distance/cruise_velocity
|
```
|
||||||
|
and the key formula for movement with constant velocity is:
|
||||||
|
```
|
||||||
|
move_distance = cruise_velocity * move_time
|
||||||
|
```
|
||||||
|
|
||||||
|
The key formulas for determining the cartesian coordinate of a move
|
||||||
|
given a move distance is:
|
||||||
|
```
|
||||||
|
cartesian_x_position = start_x + move_distance * total_x_movement / total_movement
|
||||||
|
cartesian_y_position = start_y + move_distance * total_y_movement / total_movement
|
||||||
|
cartesian_z_position = start_z + move_distance * total_z_movement / total_movement
|
||||||
```
|
```
|
||||||
|
|
||||||
Cartesian Robots
|
Cartesian Robots
|
||||||
|
@ -157,54 +174,35 @@ Generating steps for cartesian printers is the simplest case. The
|
||||||
movement on each axis is directly related to the movement in cartesian
|
movement on each axis is directly related to the movement in cartesian
|
||||||
space.
|
space.
|
||||||
|
|
||||||
|
Key formulas:
|
||||||
|
```
|
||||||
|
stepper_x_position = cartesian_x_position
|
||||||
|
stepper_y_position = cartesian_y_position
|
||||||
|
stepper_z_position = cartesian_z_position
|
||||||
|
```
|
||||||
|
|
||||||
|
CoreXY Robots
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Generating steps on a CoreXY machine is only a little more complex
|
||||||
|
than basic cartesian robots. The key formulas are:
|
||||||
|
```
|
||||||
|
stepper_a_position = cartesian_x_position + cartesian_y_position
|
||||||
|
stepper_b_position = cartesian_x_position - cartesian_y_position
|
||||||
|
stepper_z_position = cartesian_z_position
|
||||||
|
```
|
||||||
|
|
||||||
Delta Robots
|
Delta Robots
|
||||||
------------
|
------------
|
||||||
|
|
||||||
To generate step times on Delta printers it is necessary to correlate
|
Step generation on a delta robot is based on Pythagoras's theorem:
|
||||||
the movement in cartesian space with the movement on each stepper
|
|
||||||
tower.
|
|
||||||
|
|
||||||
To simplify the math, for each stepper tower, the code calculates the
|
|
||||||
location of a "virtual tower" that is along the line of movement.
|
|
||||||
This virtual tower is chosen at the point where the line of movement
|
|
||||||
(extended infinitely in both directions) would be closest to the
|
|
||||||
actual tower.
|
|
||||||
|
|
||||||
![delta-tower](img/delta-tower.svg.png)
|
|
||||||
|
|
||||||
It is then possible to calculate where the head will be along the line
|
|
||||||
of movement after each step is taken on the virtual tower.
|
|
||||||
|
|
||||||
![virtual-tower](img/virtual-tower.svg.png)
|
|
||||||
|
|
||||||
The key formula is Pythagoras's theorem:
|
|
||||||
```
|
```
|
||||||
distance_to_tower^2 = arm_length^2 - tower_height^2
|
stepper_position = (sqrt(arm_length^2
|
||||||
|
- (cartesian_x_position - tower_x_position)^2
|
||||||
|
- (cartesian_y_position - tower_y_position)^2)
|
||||||
|
+ cartesian_z_position)
|
||||||
```
|
```
|
||||||
|
|
||||||
One complexity is that if the print head passes the virtual tower
|
|
||||||
location then the stepper direction must be reversed. In this case
|
|
||||||
forward steps will be taken at the start of the move and reverse steps
|
|
||||||
will be taken at the end of the move.
|
|
||||||
|
|
||||||
### Delta movements beyond simple XY plane ###
|
|
||||||
|
|
||||||
Movement calculation is more complicated if a single move contains
|
|
||||||
both XY movement and Z movement. These moves are rare, but they must
|
|
||||||
still be handled correctly. A virtual tower along the line of movement
|
|
||||||
is still calculated, but in this case the tower is not at a 90 degree
|
|
||||||
angle relative to the line of movement:
|
|
||||||
|
|
||||||
![xy+z-tower](img/xy+z-tower.svg.png)
|
|
||||||
|
|
||||||
The code continues to calculate step times using the same general
|
|
||||||
scheme as delta moves within an XY plane, but the slope of the tower
|
|
||||||
must also be used in the calculations.
|
|
||||||
|
|
||||||
Should the move contain only Z movement (ie, no XY movement at all)
|
|
||||||
then the same math is used - just in this case the tower is parallel
|
|
||||||
to the line of movement.
|
|
||||||
|
|
||||||
### Stepper motor acceleration limits ###
|
### Stepper motor acceleration limits ###
|
||||||
|
|
||||||
With delta kinematics it is possible for a move that is accelerating
|
With delta kinematics it is possible for a move that is accelerating
|
||||||
|
@ -236,8 +234,10 @@ independently from the step time calculations of the print head
|
||||||
movement.
|
movement.
|
||||||
|
|
||||||
Basic extruder movement is simple to calculate. The step time
|
Basic extruder movement is simple to calculate. The step time
|
||||||
generation uses the same constant acceleration and constant velocity
|
generation uses the same formulas that cartesian robots use:
|
||||||
formulas that cartesian robots use.
|
```
|
||||||
|
stepper_position = requested_e_position
|
||||||
|
```
|
||||||
|
|
||||||
### Pressure advance ###
|
### Pressure advance ###
|
||||||
|
|
||||||
|
@ -264,7 +264,7 @@ through the nozzle orifice (as in
|
||||||
key idea is that the relationship between filament, pressure, and flow
|
key idea is that the relationship between filament, pressure, and flow
|
||||||
rate can be modeled using a linear coefficient:
|
rate can be modeled using a linear coefficient:
|
||||||
```
|
```
|
||||||
extra_filament = pressure_advance_coefficient * extruder_velocity
|
stepper_position = requested_e_position + pressure_advance_coefficient * nominal_extruder_velocity
|
||||||
```
|
```
|
||||||
|
|
||||||
See the [pressure advance](Pressure_Advance.md) document for
|
See the [pressure advance](Pressure_Advance.md) document for
|
||||||
|
|
|
@ -1,273 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="97.22496mm"
|
|
||||||
height="32.550285mm"
|
|
||||||
viewBox="0 0 344.49789 115.33566"
|
|
||||||
id="svg2"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.91 r13725"
|
|
||||||
sodipodi:docname="delta-tower.svg">
|
|
||||||
<defs
|
|
||||||
id="defs4">
|
|
||||||
<marker
|
|
||||||
inkscape:isstock="true"
|
|
||||||
style="overflow:visible"
|
|
||||||
id="marker6618"
|
|
||||||
refX="0"
|
|
||||||
refY="0"
|
|
||||||
orient="auto"
|
|
||||||
inkscape:stockid="Arrow1Mend">
|
|
||||||
<path
|
|
||||||
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
|
||||||
style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1"
|
|
||||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
|
|
||||||
id="path6620"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</marker>
|
|
||||||
<marker
|
|
||||||
inkscape:stockid="Arrow1Mend"
|
|
||||||
orient="auto"
|
|
||||||
refY="0.0"
|
|
||||||
refX="0.0"
|
|
||||||
id="marker6500"
|
|
||||||
style="overflow:visible;"
|
|
||||||
inkscape:isstock="true">
|
|
||||||
<path
|
|
||||||
id="path6502"
|
|
||||||
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
|
||||||
style="fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1;fill:#4b4b4b;fill-opacity:1"
|
|
||||||
transform="scale(0.4) rotate(180) translate(10,0)" />
|
|
||||||
</marker>
|
|
||||||
<marker
|
|
||||||
inkscape:isstock="true"
|
|
||||||
style="overflow:visible;"
|
|
||||||
id="marker6082"
|
|
||||||
refX="0.0"
|
|
||||||
refY="0.0"
|
|
||||||
orient="auto"
|
|
||||||
inkscape:stockid="Arrow1Mend"
|
|
||||||
inkscape:collect="always">
|
|
||||||
<path
|
|
||||||
transform="scale(0.4) rotate(180) translate(10,0)"
|
|
||||||
style="fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1;fill:#4b4b4b;fill-opacity:1"
|
|
||||||
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
|
||||||
id="path6084" />
|
|
||||||
</marker>
|
|
||||||
<marker
|
|
||||||
inkscape:stockid="Arrow1Mend"
|
|
||||||
orient="auto"
|
|
||||||
refY="0.0"
|
|
||||||
refX="0.0"
|
|
||||||
id="Arrow1Mend"
|
|
||||||
style="overflow:visible;"
|
|
||||||
inkscape:isstock="true"
|
|
||||||
inkscape:collect="always">
|
|
||||||
<path
|
|
||||||
id="path5747"
|
|
||||||
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
|
||||||
style="fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1;fill:#4b4b4b;fill-opacity:1"
|
|
||||||
transform="scale(0.4) rotate(180) translate(10,0)" />
|
|
||||||
</marker>
|
|
||||||
<marker
|
|
||||||
inkscape:stockid="Arrow1Mstart"
|
|
||||||
orient="auto"
|
|
||||||
refY="0.0"
|
|
||||||
refX="0.0"
|
|
||||||
id="Arrow1Mstart"
|
|
||||||
style="overflow:visible"
|
|
||||||
inkscape:isstock="true">
|
|
||||||
<path
|
|
||||||
id="path5744"
|
|
||||||
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
|
||||||
style="fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1;fill:#4b4b4b;fill-opacity:1"
|
|
||||||
transform="scale(0.4) translate(10,0)" />
|
|
||||||
</marker>
|
|
||||||
<marker
|
|
||||||
inkscape:stockid="Arrow1Mend"
|
|
||||||
orient="auto"
|
|
||||||
refY="0"
|
|
||||||
refX="0"
|
|
||||||
id="Arrow1Mend-1"
|
|
||||||
style="overflow:visible"
|
|
||||||
inkscape:isstock="true"
|
|
||||||
inkscape:collect="always">
|
|
||||||
<path
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
id="path4329-1"
|
|
||||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
|
|
||||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
|
||||||
transform="matrix(-0.4,0,0,-0.4,-4,0)" />
|
|
||||||
</marker>
|
|
||||||
<marker
|
|
||||||
inkscape:isstock="true"
|
|
||||||
style="overflow:visible"
|
|
||||||
id="marker6082-9"
|
|
||||||
refX="0"
|
|
||||||
refY="0"
|
|
||||||
orient="auto"
|
|
||||||
inkscape:stockid="Arrow1Mend"
|
|
||||||
inkscape:collect="always">
|
|
||||||
<path
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
|
||||||
style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1"
|
|
||||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
|
|
||||||
id="path6084-2" />
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="1.75"
|
|
||||||
inkscape:cx="172.24895"
|
|
||||||
inkscape:cy="45.708959"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:window-width="928"
|
|
||||||
inkscape:window-height="628"
|
|
||||||
inkscape:window-x="162"
|
|
||||||
inkscape:window-y="50"
|
|
||||||
inkscape:window-maximized="0"
|
|
||||||
fit-margin-top="0"
|
|
||||||
fit-margin-left="0"
|
|
||||||
fit-margin-right="0"
|
|
||||||
fit-margin-bottom="0"
|
|
||||||
showborder="false"
|
|
||||||
inkscape:snap-global="false"
|
|
||||||
showguides="false">
|
|
||||||
<inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid3436" />
|
|
||||||
</sodipodi:namedview>
|
|
||||||
<metadata
|
|
||||||
id="metadata7">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1"
|
|
||||||
transform="translate(-135.22429,-249.96955)">
|
|
||||||
<ellipse
|
|
||||||
style="fill:#4d4d4d;stroke:#4b4b4b;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:2, 1, 0.5, 1;stroke-dashoffset:0;stroke-opacity:1"
|
|
||||||
id="path4255"
|
|
||||||
cx="353.79568"
|
|
||||||
cy="327.87662"
|
|
||||||
rx="4.2857141"
|
|
||||||
ry="4.8571429" />
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1.00000006;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)"
|
|
||||||
d="M 181.50998,381.87664 359.22427,275.01949"
|
|
||||||
id="path5510"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
<text
|
|
||||||
xml:space="preserve"
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
|
||||||
x="371.22427"
|
|
||||||
y="354.44806"
|
|
||||||
id="text6058"
|
|
||||||
sodipodi:linespacing="125%"><tspan
|
|
||||||
sodipodi:role="line"
|
|
||||||
id="tspan6060"
|
|
||||||
x="371.22427"
|
|
||||||
y="354.44806">stepper</tspan><tspan
|
|
||||||
sodipodi:role="line"
|
|
||||||
x="371.22427"
|
|
||||||
y="366.94806"
|
|
||||||
id="tspan9337">tower</tspan></text>
|
|
||||||
<text
|
|
||||||
xml:space="preserve"
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
|
||||||
x="166.65283"
|
|
||||||
y="304.16235"
|
|
||||||
id="text6062"
|
|
||||||
sodipodi:linespacing="125%"><tspan
|
|
||||||
sodipodi:role="line"
|
|
||||||
id="tspan6064"
|
|
||||||
x="166.65283"
|
|
||||||
y="304.16235">line of movement</tspan></text>
|
|
||||||
<text
|
|
||||||
xml:space="preserve"
|
|
||||||
style="font-style:normal;font-weight:normal;font-size:10.0000006px;line-height:125%;font-family:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;-inkscape-font-specification:'DejaVu Sans, Normal';font-stretch:normal;font-variant:normal;text-anchor:start;text-align:start;writing-mode:lr;"
|
|
||||||
x="252.93855"
|
|
||||||
y="384.16235"
|
|
||||||
id="text6066"
|
|
||||||
sodipodi:linespacing="125%"><tspan
|
|
||||||
sodipodi:role="line"
|
|
||||||
id="tspan6068"
|
|
||||||
x="252.93855"
|
|
||||||
y="384.16235">move</tspan></text>
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1.00000006;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#marker6618)"
|
|
||||||
d="m 382.65284,344.73378 c -0.19273,-13.52091 -9.87887,-14.83602 -20.57143,-14.85715"
|
|
||||||
id="path6070"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="cc" />
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker6500)"
|
|
||||||
d="m 254.65284,374.44806 c 3.39239,-12.86009 -2.06023,-20.09154 -15.42857,-22.28571"
|
|
||||||
id="path6072"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="cc" />
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6082)"
|
|
||||||
d="m 257.50997,296.16234 c 31.05376,-3.13332 32.38959,-1.23784 42.28572,10.28572"
|
|
||||||
id="path6074"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="cc" />
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend-1)"
|
|
||||||
d="m 219.61431,358.80126 57.78715,-34.48307"
|
|
||||||
id="path3514-5"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="cc" />
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:0.50000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
|
|
||||||
d="m 351.22427,323.59092 -20.57143,-32"
|
|
||||||
id="path3358"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
<text
|
|
||||||
xml:space="preserve"
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
|
||||||
x="244.36713"
|
|
||||||
y="257.30521"
|
|
||||||
id="text4460"
|
|
||||||
sodipodi:linespacing="125%"><tspan
|
|
||||||
sodipodi:role="line"
|
|
||||||
id="tspan4462"
|
|
||||||
x="244.36713"
|
|
||||||
y="257.30521">virtual tower</tspan><tspan
|
|
||||||
sodipodi:role="line"
|
|
||||||
x="244.36713"
|
|
||||||
y="269.80521"
|
|
||||||
id="tspan5867">location</tspan></text>
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6082-9)"
|
|
||||||
d="m 310.90661,257.14111 c 21.29088,8.40268 18.35244,16.28958 20.57143,29.7143"
|
|
||||||
id="path6074-6"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="cc" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 11 KiB |
Binary file not shown.
Before Width: | Height: | Size: 8.2 KiB |
|
@ -1,241 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="64.619751mm"
|
|
||||||
height="27.45583mm"
|
|
||||||
viewBox="0 0 228.96762 97.284438"
|
|
||||||
id="svg2"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.91 r13725"
|
|
||||||
sodipodi:docname="virtual-tower.svg">
|
|
||||||
<defs
|
|
||||||
id="defs4">
|
|
||||||
<marker
|
|
||||||
inkscape:isstock="true"
|
|
||||||
style="overflow:visible"
|
|
||||||
id="marker6618"
|
|
||||||
refX="0"
|
|
||||||
refY="0"
|
|
||||||
orient="auto"
|
|
||||||
inkscape:stockid="Arrow1Mend">
|
|
||||||
<path
|
|
||||||
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
|
||||||
style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1"
|
|
||||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
|
|
||||||
id="path6620"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</marker>
|
|
||||||
<marker
|
|
||||||
inkscape:stockid="Arrow1Mend"
|
|
||||||
orient="auto"
|
|
||||||
refY="0"
|
|
||||||
refX="0"
|
|
||||||
id="marker6500"
|
|
||||||
style="overflow:visible"
|
|
||||||
inkscape:isstock="true">
|
|
||||||
<path
|
|
||||||
id="path6502"
|
|
||||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
|
|
||||||
style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1"
|
|
||||||
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</marker>
|
|
||||||
<marker
|
|
||||||
inkscape:stockid="Arrow1Mend"
|
|
||||||
orient="auto"
|
|
||||||
refY="0"
|
|
||||||
refX="0"
|
|
||||||
id="Arrow1Mend"
|
|
||||||
style="overflow:visible"
|
|
||||||
inkscape:isstock="true"
|
|
||||||
inkscape:collect="always">
|
|
||||||
<path
|
|
||||||
id="path5747"
|
|
||||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
|
|
||||||
style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1"
|
|
||||||
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</marker>
|
|
||||||
<marker
|
|
||||||
inkscape:stockid="Arrow1Mstart"
|
|
||||||
orient="auto"
|
|
||||||
refY="0"
|
|
||||||
refX="0"
|
|
||||||
id="Arrow1Mstart"
|
|
||||||
style="overflow:visible"
|
|
||||||
inkscape:isstock="true">
|
|
||||||
<path
|
|
||||||
id="path5744"
|
|
||||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
|
|
||||||
style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1"
|
|
||||||
transform="matrix(0.4,0,0,0.4,4,0)"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</marker>
|
|
||||||
<marker
|
|
||||||
inkscape:stockid="Arrow1Mend"
|
|
||||||
orient="auto"
|
|
||||||
refY="0"
|
|
||||||
refX="0"
|
|
||||||
id="Arrow1Mend-1"
|
|
||||||
style="overflow:visible"
|
|
||||||
inkscape:isstock="true"
|
|
||||||
inkscape:collect="always">
|
|
||||||
<path
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
id="path4329-1"
|
|
||||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
|
|
||||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
|
||||||
transform="matrix(-0.4,0,0,-0.4,-4,0)" />
|
|
||||||
</marker>
|
|
||||||
<marker
|
|
||||||
inkscape:isstock="true"
|
|
||||||
style="overflow:visible"
|
|
||||||
id="marker6082"
|
|
||||||
refX="0"
|
|
||||||
refY="0"
|
|
||||||
orient="auto"
|
|
||||||
inkscape:stockid="Arrow1Mend"
|
|
||||||
inkscape:collect="always">
|
|
||||||
<path
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
|
||||||
style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1"
|
|
||||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
|
|
||||||
id="path6084" />
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="1.75"
|
|
||||||
inkscape:cx="169.7719"
|
|
||||||
inkscape:cy="-4.0565054"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:window-width="922"
|
|
||||||
inkscape:window-height="628"
|
|
||||||
inkscape:window-x="162"
|
|
||||||
inkscape:window-y="50"
|
|
||||||
inkscape:window-maximized="0"
|
|
||||||
fit-margin-top="0"
|
|
||||||
fit-margin-left="0"
|
|
||||||
fit-margin-right="0"
|
|
||||||
fit-margin-bottom="0"
|
|
||||||
showborder="false"
|
|
||||||
inkscape:snap-global="false"
|
|
||||||
showguides="false">
|
|
||||||
<inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid3436"
|
|
||||||
originx="-14.085234"
|
|
||||||
originy="-95.286988" />
|
|
||||||
</sodipodi:namedview>
|
|
||||||
<metadata
|
|
||||||
id="metadata7">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title></dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1"
|
|
||||||
transform="translate(-149.30952,-172.73378)">
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)"
|
|
||||||
d="m 176.36712,256.16235 200.00001,-0.57143"
|
|
||||||
id="path5510"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="cc" />
|
|
||||||
<text
|
|
||||||
xml:space="preserve"
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
|
||||||
x="-254.01012"
|
|
||||||
y="369.20834"
|
|
||||||
id="text6058"
|
|
||||||
sodipodi:linespacing="125%"
|
|
||||||
transform="matrix(-0.01833576,-0.99983189,0.99983189,-0.01833576,0,0)"
|
|
||||||
inkscape:transform-center-x="-8.0000002"
|
|
||||||
inkscape:transform-center-y="12.571429"><tspan
|
|
||||||
sodipodi:role="line"
|
|
||||||
id="tspan10365"
|
|
||||||
x="-254.01012"
|
|
||||||
y="369.20834">virtual tower</tspan></text>
|
|
||||||
<text
|
|
||||||
xml:space="preserve"
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
|
||||||
x="148.36713"
|
|
||||||
y="269.87662"
|
|
||||||
id="text6062"
|
|
||||||
sodipodi:linespacing="125%"><tspan
|
|
||||||
sodipodi:role="line"
|
|
||||||
id="tspan6064"
|
|
||||||
x="148.36713"
|
|
||||||
y="269.87662">line of movement</tspan></text>
|
|
||||||
<text
|
|
||||||
xml:space="preserve"
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
|
||||||
x="237.50998"
|
|
||||||
y="251.01949"
|
|
||||||
id="text6066"
|
|
||||||
sodipodi:linespacing="125%"><tspan
|
|
||||||
sodipodi:role="line"
|
|
||||||
id="tspan6068"
|
|
||||||
x="237.50998"
|
|
||||||
y="251.01949">move</tspan></text>
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:7.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d="m 358.08141,255.01949 0,-82.28571"
|
|
||||||
id="path10351"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="cc" />
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d="M 220.36713,255.01949 357.50998,173.30521"
|
|
||||||
id="path10373"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="cc" />
|
|
||||||
<text
|
|
||||||
xml:space="preserve"
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
|
||||||
x="200.36713"
|
|
||||||
y="187.59093"
|
|
||||||
id="text10375"
|
|
||||||
sodipodi:linespacing="125%"><tspan
|
|
||||||
sodipodi:role="line"
|
|
||||||
id="tspan10377"
|
|
||||||
x="200.36713"
|
|
||||||
y="187.59093">virtual arm</tspan></text>
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6082)"
|
|
||||||
d="m 261.76375,182.85539 c 22.73118,-0.70136 26.45506,3.7437 40.00001,18.28573"
|
|
||||||
id="path6074"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="cc" />
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend-1)"
|
|
||||||
d="m 219.61431,255.37268 70.93001,0.37408"
|
|
||||||
id="path3514-5"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="cc" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 9.5 KiB |
Binary file not shown.
Before Width: | Height: | Size: 5.7 KiB |
|
@ -1,241 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="64.619751mm"
|
|
||||||
height="27.45583mm"
|
|
||||||
viewBox="0 0 228.96762 97.284438"
|
|
||||||
id="svg2"
|
|
||||||
version="1.1"
|
|
||||||
inkscape:version="0.91 r13725"
|
|
||||||
sodipodi:docname="xy+z-tower.svg">
|
|
||||||
<defs
|
|
||||||
id="defs4">
|
|
||||||
<marker
|
|
||||||
inkscape:isstock="true"
|
|
||||||
style="overflow:visible"
|
|
||||||
id="marker6618"
|
|
||||||
refX="0"
|
|
||||||
refY="0"
|
|
||||||
orient="auto"
|
|
||||||
inkscape:stockid="Arrow1Mend">
|
|
||||||
<path
|
|
||||||
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
|
||||||
style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1"
|
|
||||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
|
|
||||||
id="path6620"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</marker>
|
|
||||||
<marker
|
|
||||||
inkscape:stockid="Arrow1Mend"
|
|
||||||
orient="auto"
|
|
||||||
refY="0"
|
|
||||||
refX="0"
|
|
||||||
id="marker6500"
|
|
||||||
style="overflow:visible"
|
|
||||||
inkscape:isstock="true">
|
|
||||||
<path
|
|
||||||
id="path6502"
|
|
||||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
|
|
||||||
style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1"
|
|
||||||
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</marker>
|
|
||||||
<marker
|
|
||||||
inkscape:stockid="Arrow1Mend"
|
|
||||||
orient="auto"
|
|
||||||
refY="0"
|
|
||||||
refX="0"
|
|
||||||
id="Arrow1Mend"
|
|
||||||
style="overflow:visible"
|
|
||||||
inkscape:isstock="true"
|
|
||||||
inkscape:collect="always">
|
|
||||||
<path
|
|
||||||
id="path5747"
|
|
||||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
|
|
||||||
style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1"
|
|
||||||
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</marker>
|
|
||||||
<marker
|
|
||||||
inkscape:stockid="Arrow1Mstart"
|
|
||||||
orient="auto"
|
|
||||||
refY="0"
|
|
||||||
refX="0"
|
|
||||||
id="Arrow1Mstart"
|
|
||||||
style="overflow:visible"
|
|
||||||
inkscape:isstock="true">
|
|
||||||
<path
|
|
||||||
id="path5744"
|
|
||||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
|
|
||||||
style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1"
|
|
||||||
transform="matrix(0.4,0,0,0.4,4,0)"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</marker>
|
|
||||||
<marker
|
|
||||||
inkscape:stockid="Arrow1Mend"
|
|
||||||
orient="auto"
|
|
||||||
refY="0"
|
|
||||||
refX="0"
|
|
||||||
id="Arrow1Mend-1"
|
|
||||||
style="overflow:visible"
|
|
||||||
inkscape:isstock="true"
|
|
||||||
inkscape:collect="always">
|
|
||||||
<path
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
id="path4329-1"
|
|
||||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
|
|
||||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
|
||||||
transform="matrix(-0.4,0,0,-0.4,-4,0)" />
|
|
||||||
</marker>
|
|
||||||
<marker
|
|
||||||
inkscape:isstock="true"
|
|
||||||
style="overflow:visible"
|
|
||||||
id="marker6082"
|
|
||||||
refX="0"
|
|
||||||
refY="0"
|
|
||||||
orient="auto"
|
|
||||||
inkscape:stockid="Arrow1Mend"
|
|
||||||
inkscape:collect="always">
|
|
||||||
<path
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
|
||||||
style="fill:#4b4b4b;fill-opacity:1;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1pt;stroke-opacity:1"
|
|
||||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
|
|
||||||
id="path6084" />
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="1.75"
|
|
||||||
inkscape:cx="169.7719"
|
|
||||||
inkscape:cy="-4.0565054"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:window-width="922"
|
|
||||||
inkscape:window-height="628"
|
|
||||||
inkscape:window-x="162"
|
|
||||||
inkscape:window-y="50"
|
|
||||||
inkscape:window-maximized="0"
|
|
||||||
fit-margin-top="0"
|
|
||||||
fit-margin-left="0"
|
|
||||||
fit-margin-right="0"
|
|
||||||
fit-margin-bottom="0"
|
|
||||||
showborder="false"
|
|
||||||
inkscape:snap-global="false"
|
|
||||||
showguides="false">
|
|
||||||
<inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid3436"
|
|
||||||
originx="-14.085234"
|
|
||||||
originy="-95.286988" />
|
|
||||||
</sodipodi:namedview>
|
|
||||||
<metadata
|
|
||||||
id="metadata7">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title></dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1"
|
|
||||||
transform="translate(-149.30952,-172.73378)">
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)"
|
|
||||||
d="m 176.36712,256.16235 200.00001,-0.57143"
|
|
||||||
id="path5510"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="cc" />
|
|
||||||
<text
|
|
||||||
xml:space="preserve"
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
|
||||||
x="-119.27526"
|
|
||||||
y="434.37329"
|
|
||||||
id="text6058"
|
|
||||||
sodipodi:linespacing="125%"
|
|
||||||
transform="matrix(0.32454206,-0.94587127,0.94587127,0.32454206,0,0)"
|
|
||||||
inkscape:transform-center-x="-3.9400734"
|
|
||||||
inkscape:transform-center-y="14.789029"><tspan
|
|
||||||
sodipodi:role="line"
|
|
||||||
id="tspan10365"
|
|
||||||
x="-119.27526"
|
|
||||||
y="434.37329">virtual tower</tspan></text>
|
|
||||||
<text
|
|
||||||
xml:space="preserve"
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
|
||||||
x="148.36713"
|
|
||||||
y="269.87662"
|
|
||||||
id="text6062"
|
|
||||||
sodipodi:linespacing="125%"><tspan
|
|
||||||
sodipodi:role="line"
|
|
||||||
id="tspan6064"
|
|
||||||
x="148.36713"
|
|
||||||
y="269.87662">line of movement</tspan></text>
|
|
||||||
<text
|
|
||||||
xml:space="preserve"
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
|
||||||
x="237.50998"
|
|
||||||
y="251.01949"
|
|
||||||
id="text6066"
|
|
||||||
sodipodi:linespacing="125%"><tspan
|
|
||||||
sodipodi:role="line"
|
|
||||||
id="tspan6068"
|
|
||||||
x="237.50998"
|
|
||||||
y="251.01949">move</tspan></text>
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:7.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d="m 354.70239,255.76769 28.12779,-77.32895"
|
|
||||||
id="path10351"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="cc" />
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d="M 220.36713,255.01949 380.93855,178.44807"
|
|
||||||
id="path10373"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="cc" />
|
|
||||||
<text
|
|
||||||
xml:space="preserve"
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
|
||||||
x="200.36713"
|
|
||||||
y="187.59093"
|
|
||||||
id="text10375"
|
|
||||||
sodipodi:linespacing="125%"><tspan
|
|
||||||
sodipodi:role="line"
|
|
||||||
id="tspan10377"
|
|
||||||
x="200.36713"
|
|
||||||
y="187.59093">virtual arm</tspan></text>
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-rule:evenodd;stroke:#4b4b4b;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6082)"
|
|
||||||
d="m 261.76375,182.85539 c 22.73118,-0.70136 26.45506,3.7437 40.00001,18.28573"
|
|
||||||
id="path6074"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="cc" />
|
|
||||||
<path
|
|
||||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend-1)"
|
|
||||||
d="m 219.61431,255.37268 70.93001,0.37408"
|
|
||||||
id="path3514-5"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="cc" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 9.5 KiB |
Binary file not shown.
Before Width: | Height: | Size: 6.5 KiB |
Loading…
Reference in New Issue