[Question]
  [
## [Sandbox](https://codegolf.meta.stackexchange.com/a/17644/75681)
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.
  
[Answer]
# 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=>([X,Y,Z]=a,m=[],W=X*6+Z*2,'1uol9h824lsqpq17de52u1okgnv21dnjaww111qmhx1gxf4m50xg6pb42kzijq21xyh34t0h2gueq0qznnza2rrimsg3bkrxfh3yrh0em').replace(/.{7}/g,s=>[[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]&&(g=H=>V<h&&((m[r=y-(3-B)*p+(t>1?H-V:V)+Y*3+Z*2]=m[r]||Array(W*2+9).fill` `)[x-2*(3-A)*p+(t>1?V:H-V*t)+W]=` ${c>5?'  + ':t>1?'|-':'-|'}+/+`[(H%~-w?0:+t?4:2)|!(V%~-h)],g(++H<w?H:!++V)))(V=0,p=a[c%3],w-=-3*C*p,h-=-D*p))&&m
```
[Try it online!](https://tio.run/##bZLZbuJAEEXf8xVGSnAvZccLkIlJg7JJzA8YL2MJxxgb8EbbCWabX2fa0mgeonm6V6fubalKvQm/wjri66pRinIZX1fsGrIJ8h1wwQtYCDnzA5gzh4yoRwyQ9c8ye0x/GIOs3lU7/WEZD41PvdwmxZehL4tNuN/rur7L01ZP2tUgH2ptMqo@Bsb2uN7sDL09pOag0VIj@Yx32u5YFMfQ4Hyd14n5seXtKjUPPNXiXMYqj6ssjGJ0r54eLvcJ1Gzi@xG08AwHeIE9vEIKb9AErAp5Hf8sGlSDOcK0BpfMwQOxxbknDHHAIS7pCUI80nPFWIgT@FHQ76OEzdjEfkqFRbnP2UFBpvKCSUVRM9GnM8W2bExdYnYXCJiIBOfzM@fhAc2JQR@xulpn2UJaYL9VDCLKz//KtiXqpMF0HrCFdHuKJsOpLElUkq1uLJ8V2ZKVs3yh93Tho9ndb2U/1SzaTAeWgc89ZAuS4gASROnsaT@dWT1KbYwxspkGFQv96M4MYK8wxSSvpIJUuDdSYdzv59exr4EORqCuSv4eRilyJDaRvkP3f9Dr4OlGkqKyqMssVrMyQQuH3Z6cC0iuUFeoJ9S7LPD4W3DVfSHJFYEAq3lYId49x9VNuS6QLGP81/0qZNxdo9PxzUXsdf0D "JavaScript (Node.js) – Try It Online")
## How?
### Drawing steps
The output consists of 15 sides, drawn in a specific order.
[![animation](https://i.stack.imgur.com/2ey7R.gif)](https://i.stack.imgur.com/2ey7R.gif)
### 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} & c & o\_x & m\_x & o\_y & m\_y & o\_w & m\_w & o\_h & m\_h & t\\
\hline
0 & 4 & 0 & 0 & 2 & -3 & 7 & 0 & 4 & 6 & 0\\
1 & 4 & 6 & 0 & 2 & -3 & 4 & 6 & 3 & 0 & 2\\
2 & 2 & 6 & -2 & 2 & 2 & 4 & 0 & 3 & 4 & 2\\
3 & 3 & 6 & 6 & 2 & 0 & 4 & 0 & 3 & 0 & 2\\
4 & 3 & 0 & -6 & 2 & 0 & 7 & 12 & 4 & 0 & 0\\
5 & 2 & 2 & 2 & 0 & -2 & 7 & 0 & 3 & 4 & 1\\
6 & 3 & 2 & -6 & 0 & 0 & 7 & 12 & 3 & 0 & 1\\
7 & 2 & 0 & -2 & 2 & 2 & 7 & 0 & 4 & 0 & 0\\
8 & 5 & 6 & -2 & 2 & 2 & 4 & 0 & 1 & 2 & 2\\
9 & 4 & 2 & 0 & 0 & -3 & 7 & 0 & 3 & 0 & 1\\
10 & 1 & 0 & 0 & 2 & -3 & 7 & 0 & 1 & 3 & 0\\
11 & 1 & 6 & 0 & 2 & -3 & 1 & 3 & 3 & 0 & 2\\
12 & 6 & 0 & 0 & 2 & 0 & 7 & 0 & 4 & 0 & 0\\
13 & 7 & 2 & 0 & 0 & 0 & 7 & 0 & 3 & 0 & 1\\
14 & 8 & 6 & 0 & 2 & 0 & 4 & 0 & 3 & 0 & 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`.
[Answer]
# [APL (Dyalog Classic)](https://www.dyalog.com/), ~~162~~ ~~161~~ ~~132~~ 130 bytes
```
{' |+/+ +-? ??? ++'[⍉(⊃~∘0)⍤1⍣3⍉↑a↑¨⍨↓(--1-⌊/∘,)2-/1⌽↑⍳⍴a←16|29|1+{2⊥+/¨∊¨=⌿¨⍵(⍉⍵)(⍉↓⍵)}⌺2 2 2{⍉⍤2⍉⌽0,⍵}⍣6↑3/↓2/6⌿1<⍵+.=⍨↑⍳1+2×⍵]}
```
[Try it online!](https://tio.run/##RU/BSsNAEL37FXvrLtt1MxsJCJYcvNiTYL2Jh1CpFAIVepIkXoRQQzZUStG7FXLzoL0IRYh/Mj8SZ9ODDLszb97btzPRXaxu7qN4dqvGcTSfT8ctVuvpDPOl1yY9lkotmVQhC8OQSdm7QvvEsXh8wMWrJ9BuAO2bT03MnyM6TY22xnzFlQKFZaFJ1xdGacByRzzaT7RfpFxCkJrjFGRisHiXmh4uiqYeYPnjPLbcedqt6HK@cmWG5bdhFEnHbYxL5c7rE5nRGAH5@5rERgdkAyfUl4eDbiD3MUjz@0K966yd0ABoK1p1eE7bNB@@k1Tr0cUp3Zdnw1E7aWruMQrBYZ8cAofAIfOPQBzs1a4kwmdH4g8 "APL (Dyalog Classic) – Try It Online")
* generate a 3d bool array of unit cubies
* replicate each cubie 6 3 2 times along x y z
* surround with zeroes
* for each 2×2×2 subarray compute a number between 0 and 16 that determines the corresponding output char: `(1 + 4*cx + 2*cy + cz) mod 16` where `cx`,`cy`,`cz` are the number of same-value "rods" along axis x,y,z, i.e. vectors along that axis that consist of the same value: 0 0 or 1 1. we make an exception if the subarray is all-zero (or all-one - those don't matter) and we consider its number 0 instead of 28
* for each cell compute where the corresponding char should be drawn on screen
* for each cell build a transparent (0-padded) matrix that contains only one opaque "pixel"
* mix the matrices - at this point we have a 5d array with dimensions inx,iny,inz,outx,outy
* reduce the first three axes, keeping only the first non-transparent (≠0) item along them
* use a lookup table (a string) to convert the numbers into `-|/+`
thanks Scott Milner for spotting that some `+`s rendered as `?`s
[Answer]
# [Charcoal](https://github.com/somebody1234/Charcoal), 325 bytes
```
≔×⁶Ｎθ≔×³Ｎη≔⊗Ｎζ¿‹¹№⟦θηζ⟧⁰«Ｂ⁺⁷⊗θ⁺⁴⊗η↗↗⊕⊗ζ+⁺⁵⊗θＰ↙⊗⊕ζ↓+↓⁺²⊗η↙+↙⊕⊗ζ»«Ｆ‹⁰θ«↗+↗←+←⊖θ↙+/Ｐ→θ↓+↓²+⊖θ+»Ｆ‹⁰η«Ｊ⁶¦³↗+↗↓+↓⊖η↙+/Ｐ↑η←+←⁵↑+↑⊖η+»Ｆ‹⁰ζ«Ｊ⁸±²↓+↓↓↗+↗⊖ζ↑+↑²Ｐ↙ζ←+←⁵↙+↙⊖ζ+»Ｊ⁶¦⁰Ｆ‹⁰ζ«Ｇ↓³↙⊕ζ←⁷↑³↗⊕ζ ↙+↙⊖ζ↓+↓²+→⁵Ｐ↗ζ↑+↑²Ｐ←⁶↗+↗⊖ζ»Ｆ‹⁰η«Ｇ←⁶↑⊕η↗³→⁶↓⊕η ↑+↑⊖η←+←⁵↙+/Ｐ↓η+⁵Ｐ↗²↓+↓⊖η»Ｆ‹⁰θ«Ｇ↗²→⊕θ↓⁴↙²←⊕θ →+⊖θ↗+/↑+↑²Ｐ←θ↙+/Ｐ↓³←+←⊖θ»Ｐ↗∧∧θη²Ｐ↓∧∧ζθ³Ｐ←∧∧ηζ⁶+
```
[Try it online!](https://tio.run/##rZZdb9owFIavy6@wcmVrmcoSoNV61Y2bTV2FpvZq2gWlhkQKcT67LRO/PbNjB3/FFaS7QMDxa5/Xz/FxsonWxYask7a9Lct4l8KHeI9LuPDBlzSrq/t6/4QLiJAPcnQz0TShrYmkZknqpwQ/Q1PSUEm8BfAOlyX84IPPpE4r@COnk@ngTx9MEULg7@TiE/kNV0ldwisf9IvlbIUuOJPBiE64mVx8Iy8YfnzMvse7qGKBVRHTlfsIM7sp8B6nFZ3Tz234XC713nnyT5dlrqXustRJFWd85SX5ld7hbSVFagpt6U7rAy2DiHWJAms7KzOHPZfH3ds6AJyUmLHckkIQn7JCdnwtPiKBDbJXaj704BJLE7k6rPq/FOsrCEVqa4qVhgcDJaQLdAO27GBAiASEr/U@eyDsvIdqutOhvOJW9RShM6g8ZryVTiE/121bKhZyGnHAaXQ41z64x7t1hWGA3FvnhFhs6K@LqxlXrTbohL0FFj0JtxnD0Oo4e8BpUvKU52rKIoN4VyT5syNpD5Lep462buitJ6zSy7Dbdth9D9xsTOsB73/taFw39n09HzjaYqgZVVvudvHGI@W6DI4FEWkEaxVvhFTwrAri50JUz5Yb1Ti3R0cd3IFLhZuLnDV7pVbB6Avv4Hr29KRlDolSBZijI9eZ1h/BsSVMucF78HQ4Hxfqcbr03nBG87NLE4561grKg3W7TZ8h@7CXK8SsDr3BSFnDXDMfpozn7WXsPQ2xJjTfnA5tG4AQzNr3L8k/ "Charcoal – Try It Online") Link is to verbose version of code. Explanation:
```
≔×⁶Ｎθ≔×³Ｎη≔⊗Ｎζ
```
Input the extrusions, but premultiply them to save bytes.
```
¿‹¹№⟦θηζ⟧⁰«Ｂ⁺⁷⊗θ⁺⁴⊗η↗↗⊕⊗ζ+⁺⁵⊗θＰ↙⊗⊕ζ↓+↓⁺²⊗η↙+↙⊕⊗ζ»«
```
If at least two of the extrusions are zero, then simply draw a cuboid of dimensions (2x+1, 2y+1, 2z+1). Otherwise:
```
Ｆ‹⁰θ«↗+↗←+←⊖θ↙+/Ｐ→θ↓+↓²+⊖θ+»
```
Print the left extrusion, if any.
```
Ｆ‹⁰η«Ｊ⁶¦³↗+↗↓+↓⊖η↙+/Ｐ↑η←+←⁵↑+↑⊖η+»
```
Print the down extrusion, if any.
```
Ｆ‹⁰ζ«Ｊ⁸±²↓+↓↓↗+↗⊖ζ↑+↑²Ｐ↙ζ←+←⁵↙+↙⊖ζ+»
```
Print the back extrusion, if any.
```
Ｊ⁶¦⁰
```
The remaining extrusions all meet at this point (which doesn't get drawn until the very end!)
```
Ｆ‹⁰ζ«Ｇ↓³↙⊕ζ←⁷↑³↗⊕ζ ↙+↙⊖ζ↓+↓²+→⁵Ｐ↗ζ↑+↑²Ｐ←⁶↗+↗⊖ζ»
```
Print the front extrusion, if any, taking care to erase parts of the left and down extrusions that may overlap.
```
Ｆ‹⁰η«Ｇ←⁶↑⊕η↗³→⁶↓⊕η ↑+↑⊖η←+←⁵↙+/Ｐ↓η+⁵Ｐ↗²↓+↓⊖η»
```
Print the up extrusion, if any, taking care to erase parts of the back and left extrusions that may overlap.
```
Ｆ‹⁰θ«Ｇ↗²→⊕θ↓⁴↙²←⊕θ →+⊖θ↗+/↑+↑²Ｐ←θ↙+/Ｐ↓³←+←⊖θ»
```
Print the right extrusion, if any, taking care to erase parts of the down and back extrusions that may overlap.
```
Ｐ↗∧∧θη²Ｐ↓∧∧ζθ³Ｐ←∧∧ηζ⁶+
```
Draw the joins between the latter extrusions.
[Answer]
# [Charcoal](https://github.com/somebody1234/Charcoal), ~~195~~ ~~164~~ 144 bytes
```
≔⁺³×⁶Ｎθ≔⁺²×³Ｎη≔⊕⊗ＮζＦ…·±ζζＦ…·±ηηＦ…·±θθ«Ｊ⁻λι⁺κι≔⟦⟧δＦＥ²↔⁻⁺ιμ·⁵ＦＥ²↔⁻κνＦＥ²↔⁻⁺λξ·⁵⊞δ⌊⟦‹μζ‹νη‹ξθ‹¹№Ｅ⟦μνξ⟧‹π⊕ρ¹⟧≡Σδ¹+²§ |-/⁺⌕δ¹⌕⮌δ¹¦³+⁴§ +Σ…δ⁴¦⁶§ |-/⌕δ⁰
```
[Try it online!](https://tio.run/##fZHBT8IwFMbP8Fe87NSGoo4hBz0RjAlGCEFuhMPYKmtcu7FuOFH@9vlahpCAnPbW/t73vu81iPwsSPy4qvpai5Uik7jQxGMwE5Jr0mMwVGmRjwu55BmhlDJY08fmKdw5wN4FODrCQxVkXHKV85A8JcUyxu8Zv0X@PcnA0CguNnzqqxUnY77yc062FqFwBYns1KvI2qag8N1svBQynSVkJBQmiRkIvLKpPkyNZhq1@/mCQWj@re7IT03u/lLXrbZHMJDYf3OPUWoDZyDqqivXVgd9lEedSaEjEjJAQMhCkvkr15pIswgGtlYmcV2XJlpduwwGSaFyO2aOHQiWi/oyNa91fJHMrt@ldGFT60@RBxGQNxwY7lcV@JqD@wCTTKCk03IMZw87h8N@PlQhL4kDP@1bp97ks1Ch8e@ivq2nfMMzzVHXDqR/Ot4l8e65eAuljbHBVxDzQZSkRr57qtT7z9HBzN0e3jV3VeVCB7yqvYl/AQ "Charcoal – Try It Online") Link is to verbose version of code. I'm posting this as a separate answer as it uses a completely different approach to drawing the extrusion. Explanation:
```
≔⁺³×⁶Ｎθ≔⁺²×³Ｎη≔⊕⊗Ｎζ
```
Input the extrusions and calculate half the size of the enclosing cuboid, but in integer arithmetic because Charcoal's ranges are always integers. The origin of the output maps to the centre of the original unit cube.
```
Ｆ…·±ζζＦ…·±ηηＦ…·±θθ«
```
Loop over all coordinates within (including the boundary) the cuboid containing the extrusion.
```
Ｊ⁻λι⁺κι
```
Jump to the output position corresponding to those coordinates.
```
≔⟦⟧δＦＥ²↔⁻⁺ιμ·⁵ＦＥ²↔⁻κνＦＥ²↔⁻⁺λξ·⁵⊞δ⌊⟦‹μζ‹νη‹ξθ‹¹№Ｅ⟦μνξ⟧‹π⊕ρ¹⟧
```
From the given coordinates, peek in all eight diagonal directions to determine whether the extrusion overlaps in that direction. The peeked coordinates are checked that they still lie within the cuboid, and then the number of axes in which the coordinate lies within the original cube must be greater than 1. Note that since the cube has an odd display height, the Y-axis values that are peeked are integers while the other axes use fractional coordinates.
```
≡Σδ
```
Consider the number of directions in which the extrusion overlaps. There are five cases of interest where we want to print something, as in the case of zero, that means that this is empty space and we don't want to print anything, while in the case of eight, that means that this is inside the extrusion and anything we did print would be overprinted by a layer nearer the eye point.
```
¹+
```
If the extrusion only overlaps in one direction then this is an outer corner and we need to output a `+`.
```
²§ |-/⁺⌕δ¹⌕⮌δ¹¦
```
If the extrusion overlaps in two directions then this is an outer edge. Which sort of edge is determined from the separation between the two overlaps; 6 and 7 are rear-facing edges and will get overwritten, 4 is a diagonal edge, 2 is a vertical edge and 1 is a horizontal edge. (I actually calculate 7 minus the separation as it seems to be easier to do.)
```
³+
```
If the extrusion overlaps in three directions then this is an inner corner in the case where one of the extrusions is zero and we need to output a `+`.
```
⁴§ +Σ…δ⁴¦
```
If the extrusion overlaps in four directions then there are two cases: faces (any direction), and inner corners in the case with three positive extrusions. In the latter case there are an odd number of overlaps towards the viewer.
```
⁶§ |-/⌕δ⁰
```
If the extrusion overlaps in six directions then this is an inner edge. It works like the complement of an outer edge except that we're only interested when one of the two empty spaces is the direction towards the eye point (the last entry in the array).
[Answer]
# [K (ngn/k)](https://gitlab.com/n9n/k), 172 bytes
```
{s:1+|/'i-:&//i:1_--':1_4#!#'2*:\a:16!29!1+2/(!3){+'+x}/'{2+':''1+':'0=':x}'{++'x}\6{+'+0,|x}/{6}#{3}#'{2}#''s#1<+/x=!s:1+2*x;" |+/+ +-? ??? ++"s#@[&*/s;s/i;{x+y*~x};,//a]}
```
[Try it online!](https://tio.run/##XY7LbsIwEEX3/YoJljBkEjl2EFKdovAf0IcFDo0ICYqT1pVxf506LDszOqujO/ectqf2fq@kM5LjjdE6lXPGasnf05QGrkhEqIjlXkm@jsRzxFGwRZQvHVK0nlEnkEpK@cRsQ6X11CFS6/frScmSW7Dc2hOXexLsAGoIf0FmN9H0VMS2mMENGQKmJZRlCYgzQ7a7ecxMYVhdOIs/8a/1RcKYevVTXbRvSRySd6J4rbbwf9hFnTVUoBrTQa8v3ZcGM/Z9N7bHuj3B92c9aHNVB/30AZlMWEUXGOUkXyYLATmsCp7B45YhTDUNjFcYOhCPVe0RFBy68dpo0HboFYS04f4H "K (ngn/k) – Try It Online")
obligatory k rewrite of [my apl solution](https://codegolf.stackexchange.com/questions/185449/extrude-the-faces-of-a-cube-symmetrically-along-xyz/185458#185458)
same algorithm, except that 3d->2d rendering is done with (the k equivalent of) scatter index assignment instead of creating 2d matrices for each 3d element and mixing them
]