Extrude the faces of a cube symmetrically along XYZ Sandbox

For the purposes of the current task, a cube of unit length is rendered in oblique projection with ASCII symbols as follows:

  +-----+
 /     /|
+-----+ |
|     | +
|     |/
+-----+



+ for the vertices.
- for the X edges. The unit length along X is represented by five - between two vertices.
| for the Y edges. The unit length along Y is represented by two | between two vertices.
/ for the Z edges. The unit length along Z is represented by one / between two vertices.
Vertices are only drawn where all the three planes intersect.
Edges are only drawn where exactly two planes intersect.


When a unit face is extruded, it is offset by a unit length from its original position and four new edges are created for each direction (positive and negative). 

You can think of the extrusion as of drawing the axes of a 3D Cartesian coordinate system where each axis is represented as a cuboid with cross section 1x1 and length n away from (0,0,0)

Extruded by 1 along X:

  +-----------------+
 /                 /|   
+-----------------+ |
|                 | +
|                 |/
+-----------------+


Task

Given three numbers for the XYZ axes, extrude the faces of a unit cube symmetrically by the indicated amounts and render the result with the ASCII symbols as specified above.

Input

x, y, z – non-negative numbers - extrusion lengths for the respective axes. 0 means no extrusion.
The input can be three numbers, a list of three numbers, a triple, a string or anything that’s convenient for you.

Output

The ASCII drawing of the cube after extrusion. Leading and trailing wihtespaces are allowed.

Test cases

X Y Z
0 0 0

  +-----+
 /     /|
+-----+ |
|     | +
|     |/
+-----+

1 0 0

  +-----------------+
 /                 /|   
+-----------------+ |
|                 | +
|                 |/
+-----------------+


0 0 1   
        +-----+
       /     /|
      /     / |
     /     /  +
    /     /  /
   /     /  /
  +-----+  /
  |     | / 
  |     |/
  +-----+


1 1 0

        +-----+
       /     /|      
      +-----+ |
  +---|     | +-----+
 /    |     |/     /|
+-----+     +-----+ |
|                 | +
|                 |/
+-----+     +-----+
      |     | +
      |     |/
      +-----+

2 0 1

                +-----+
               /     /|
  +-----------+     +-----------+
 /                             /|
+-----------+     +-----------+ |
|          /     /|           | +
|         +-----+ |           |/
+---------|     | +-----------+
          |     |/
          +-----+

1 1 1 

        +-----+
       /     /|-+   
      +-----+ |/|
  +---|     | +-----+
 /    |     |/     /|
+-----+-----+-----+ |
|    /     /|     | +
|   +-----+ |     |/
+---|     | +-----+
    |     |/| +
    +-----+ |/
      +-----+


Winning criteria

The shortest solution in bytes in every language wins. Please add a short description of the method used and your code.
JavaScript (ES6),  525 ... 475 471  459 bytes
Saved 13 bytes thanks to @Neil
Takes input as an array [X,Y,Z]. Returns a matrix of characters.
a=&gt;([X,Y,Z]=a,m=[],W=X*6+Z*2,'1uol9h824lsqpq17de52u1okgnv21dnjaww111qmhx1gxf4m50xg6pb42kzijq21xyh34t0h2gueq0qznnza2rrimsg3bkrxfh3yrh0em').replace(/.{7}/g,s=&gt;[[c,x,A,y,B,w,C,h,D,t]=parseInt(s,36)+s,Y*W,Z,X,Y|!W,Z*X,X*Y*!Z,X*Z*!Y,Y*Z*!X][c]&amp;&amp;(g=H=&gt;V&lt;h&amp;&amp;((m[r=y-(3-B)*p+(t&gt;1?H-V:V)+Y*3+Z*2]=m[r]||Array(W*2+9).fill` `)[x-2*(3-A)*p+(t&gt;1?V:H-V*t)+W]=` ${c&gt;5?'  + ':t&gt;1?'|-':'-|'}+/+`[(H%~-w?0:+t?4:2)|!(V%~-h)],g(++H&lt;w?H:!++V)))(V=0,p=a[c%3],w-=-3*C*p,h-=-D*p))&amp;&amp;m

Try it online!
How?
Drawing steps
The output consists of 15 sides, drawn in a specific order.

Implementation
The drawing function is \$g\$. It works with the following parameters:

\$(x, y)\$: where to start drawing
\$w\$: width
\$h\$: height
\$t\$: type of side

The vertices are always drawn. Depending on the value of another parameter \$c\$, the edges are either drawn or erased.
If \$t=0\$, the function draws a front side:
...........      ...........
..+-----+..      ..+     +..
..|     |..  or  ..       ..
..|     |..      ..       ..
..+-----+..      ..+     +..
...........      ...........

If \$t=1\$, it draws a top side:
...........      ...........
...+-----+.      ...+     +.
../     /..  or  ..       ..
.+-----+...      .+     +...
...........      ...........

If \$t=2\$, it draws a right side:
......+....      ......+....
...../|....      .....  ....
....+ |....  or  ....+  ....
....| +....      ....  +....
....|/.....      ....  .....
....+......      ....+......

The coordinates \$(x,y)\$ and the size \$(w,h)\$ of each side either have a constant value or depend on exactly one of the input variables: \$X\$, \$Y\$ or \$Z\$. Besides, each side is drawn if and only if a specific condition is met.
Both the input variable to use and the condition to check are identified with the parameter \$c \in[1..8]\$.
To summarize, a side is fully described with:
$$\begin{cases}
c\\
t\\
x=o_x+m_x\times P\\
y=o_y+m_y\times P\\
w=o_w+m_w\times P\\
h=o_h+m_h\times P
\end{cases}
$$
where \$P\$ is the input variable deduced from \$c\$.
Therefore, we need to store the following 10 parameters for each side:
$$[c, o_x, m_x, o_y, m_y, o_w, m_w, o_h, m_h, t]$$
Below are the parameters of the 15 sides that need to be drawn:
$$\begin{array}{|c|c|}
\hline
\text{side} &amp; c &amp; o_x &amp; m_x &amp; o_y &amp; m_y &amp; o_w &amp; m_w &amp; o_h &amp; m_h &amp; t\\
\hline
0 &amp; 4 &amp; 0 &amp; 0 &amp; 2 &amp; -3 &amp; 7 &amp; 0 &amp; 4 &amp; 6 &amp; 0\\
1 &amp; 4 &amp; 6 &amp; 0 &amp; 2 &amp; -3 &amp; 4 &amp; 6 &amp; 3 &amp; 0 &amp; 2\\
2 &amp; 2 &amp; 6 &amp; -2 &amp; 2 &amp; 2 &amp; 4 &amp; 0 &amp; 3 &amp; 4 &amp; 2\\
3 &amp; 3 &amp; 6 &amp; 6 &amp; 2 &amp; 0 &amp; 4 &amp; 0 &amp; 3 &amp; 0 &amp; 2\\
4 &amp; 3 &amp; 0 &amp; -6 &amp; 2 &amp; 0 &amp; 7 &amp; 12 &amp; 4 &amp; 0 &amp; 0\\
5 &amp; 2 &amp; 2 &amp; 2 &amp; 0 &amp; -2 &amp; 7 &amp; 0 &amp; 3 &amp; 4 &amp; 1\\
6 &amp; 3 &amp; 2 &amp; -6 &amp; 0 &amp; 0 &amp; 7 &amp; 12 &amp; 3 &amp; 0 &amp; 1\\
7 &amp; 2 &amp; 0 &amp; -2 &amp; 2 &amp; 2 &amp; 7 &amp; 0 &amp; 4 &amp; 0 &amp; 0\\
8 &amp; 5 &amp; 6 &amp; -2 &amp; 2 &amp; 2 &amp; 4 &amp; 0 &amp; 1 &amp; 2 &amp; 2\\
9 &amp; 4 &amp; 2 &amp; 0 &amp; 0 &amp; -3 &amp; 7 &amp; 0 &amp; 3 &amp; 0 &amp; 1\\
10 &amp; 1 &amp; 0 &amp; 0 &amp; 2 &amp; -3 &amp; 7 &amp; 0 &amp; 1 &amp; 3 &amp; 0\\
11 &amp; 1 &amp; 6 &amp; 0 &amp; 2 &amp; -3 &amp; 1 &amp; 3 &amp; 3 &amp; 0 &amp; 2\\
12 &amp; 6 &amp; 0 &amp; 0 &amp; 2 &amp; 0 &amp; 7 &amp; 0 &amp; 4 &amp; 0 &amp; 0\\
13 &amp; 7 &amp; 2 &amp; 0 &amp; 0 &amp; 0 &amp; 7 &amp; 0 &amp; 3 &amp; 0 &amp; 1\\
14 &amp; 8 &amp; 6 &amp; 0 &amp; 2 &amp; 0 &amp; 4 &amp; 0 &amp; 3 &amp; 0 &amp; 2\\
\hline
\end{array}$$
We force all values into the range \$[0..9]\$ by applying the following operations:
$$m_x\gets (m_x+6)/2\\
m_y\gets m_y+3\\
m_w\gets m_w/3$$
It results in 15 numbers of exactly 10 decimal digits, which are stored as 15 groups of 7 digits in base 36.
For instance, the first side is encoded as 4032070460 and stored as 1uol9h8.