mirror of
https://github.com/nophead/NopSCADlib.git
synced 2025-09-04 20:56:07 +02:00
Compare commits
10 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
62bd2b5597 | ||
|
18cd33c663 | ||
|
e899306a13 | ||
|
ebfb330ac6 | ||
|
07da7d8dc7 | ||
|
38b52d13ee | ||
|
5a3bbf967d | ||
|
ddb2f16b99 | ||
|
c5fab08a45 | ||
|
fecc93746a |
27
CHANGELOG.md
27
CHANGELOG.md
@@ -3,6 +3,31 @@
|
||||
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
|
||||
|
||||
|
||||
## [v21.0.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.0.0 "show release") Breaking Changes [...](https://github.com/nophead/NopSCADlib/compare/v20.24.0...v21.0.0 "diff with v20.24.0")
|
||||
* 2023-03-10 [`9d4d5ab`](https://github.com/nophead/NopSCADlib/commit/9d4d5aba17974e7b5911e723d48d7b9403a4bcb4 "show commit") [C.](# "Chris") `veroboard_assembly()` renamed `veroboard_fastened_assembly()`.
|
||||
`veroboard_assembly()` now doesn't include the fasteners.
|
||||
|
||||
### [v20.24.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.24.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.23.0...v20.24.0 "diff with v20.23.0")
|
||||
* 2023-03-10 [`d939401`](https://github.com/nophead/NopSCADlib/commit/d939401183d12af3452e17aa5b020dab50f8edb0 "show commit") [C.](# "Chris") Added `vero_grid_pos()` function.
|
||||
|
||||
* 2023-03-10 [`584542f`](https://github.com/nophead/NopSCADlib/commit/584542f87a27efe06ff3ba597dbaff1f3c32c4fd "show commit") [C.](# "Chris") Added fastons.
|
||||
|
||||
* 2023-03-10 [`62372a0`](https://github.com/nophead/NopSCADlib/commit/62372a049b9ac7a0fecebfd3618df91ff6ffa87a "show commit") [C.](# "Chris") The `wire()` module can now draw wires if a path is specified.
|
||||
|
||||
* 2023-03-10 [`14698e5`](https://github.com/nophead/NopSCADlib/commit/14698e5203e1e860230ddb3729816730e221f49c "show commit") [C.](# "Chris") Added PTFE heatshrink sleeving.
|
||||
|
||||
* 2023-03-10 [`14f6bb5`](https://github.com/nophead/NopSCADlib/commit/14f6bb533a3dcc1d36b2b764906cdca7d8d24484 "show commit") [C.](# "Chris") Added `sleeving_length` to `al_clad_resistor_assembly()`.
|
||||
|
||||
* 2023-03-10 [`01e9aae`](https://github.com/nophead/NopSCADlib/commit/01e9aae698f57bac6046d1a04aaa11b0c88006b5 "show commit") [C.](# "Chris") Added `TO220_size()` and `TO220_lead_pos(i,` l).
|
||||
|
||||
* 2023-02-04 [`27f9b24`](https://github.com/nophead/NopSCADlib/commit/27f9b242f250c0083344a05527055bb2fbb56f91 "show commit") [C.P.](# "Chris Palmer") Added crystal, transistors, diode and LEDs to Arduino Uno.
|
||||
|
||||
* 2023-02-03 [`f07fda7`](https://github.com/nophead/NopSCADlib/commit/f07fda70cdfc743cd2462636fcc1eb13a092f9e4 "show commit") [C.P.](# "Chris Palmer") Wire links can now be sleeved.
|
||||
|
||||
* 2023-02-01 [`abf1f1a`](https://github.com/nophead/NopSCADlib/commit/abf1f1ab3f3eddc2f274df649e8481a4117901eb "show commit") [C.P.](# "Chris Palmer") PCB blocks can now have rounded edges for more realistic cans.
|
||||
|
||||
* 2023-02-01 [`df06d1f`](https://github.com/nophead/NopSCADlib/commit/df06d1f57fff64cd6da20684f8371da204f69a82 "show commit") [C.P.](# "Chris Palmer") Updated changelog.
|
||||
|
||||
### [v20.23.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.23.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.22.0...v20.23.0 "diff with v20.22.0")
|
||||
* 2023-02-01 [`470d6d6`](https://github.com/nophead/NopSCADlib/commit/470d6d6216b1cef8ce6cafd4b14300edb62eac4a "show commit") [C.P.](# "Chris Palmer") Started radial components with crystals.
|
||||
|
||||
@@ -44,7 +69,7 @@ This changelog is generated by `changelog.py` using manually added semantic vers
|
||||
* 2023-01-24 [`77e948f`](https://github.com/nophead/NopSCADlib/commit/77e948f43c911442211bcbf6d1b1520184d2c70b "show commit") [C.P.](# "Chris Palmer") Added can bus connectors to OpenGrab model.
|
||||
Tweaked some PCB component positions.
|
||||
|
||||
* 2023-01-24 [`543cdb4`](https://github.com/nophead/NopSCADlib/commit/543cdb4e01d38308a06d4368ebabadb85c696567 "show commit") [C.P.](# "Chris Palmer") Incresed the clearance of holes made for pin header.
|
||||
* 2023-01-24 [`543cdb4`](https://github.com/nophead/NopSCADlib/commit/543cdb4e01d38308a06d4368ebabadb85c696567 "show commit") [C.P.](# "Chris Palmer") Increased the clearance of holes made for pin header.
|
||||
|
||||
### [v20.19.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.19.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.18.1...v20.19.0 "diff with v20.18.1")
|
||||
* 2023-01-12 [`ebd50ba`](https://github.com/nophead/NopSCADlib/commit/ebd50bae535283b94b310ee74c9b98b2e3b7f8be "show commit") [C.P.](# "Chris Palmer") Added SMD diodes, inductors and potentiometers.
|
||||
|
@@ -2,7 +2,7 @@
|
||||
|
||||
## Requirements
|
||||
1. OpenSCAD 2021.01 or later, download it from here: https://www.openscad.org/downloads.html
|
||||
1. Python 2.7+ or 3.6+ from https://www.python.org/downloads/
|
||||
1. Python 3.6+ from https://www.python.org/downloads/
|
||||
1. ImageMagick 7 www.imagemagick.org
|
||||
|
||||
These are all cross platform tools so NopSCADlib should work on any platform that supports them, although it has currently only been tested on Win7.
|
||||
|
2
lib.scad
2
lib.scad
@@ -49,6 +49,7 @@ include <vitamins/magnets.scad>
|
||||
include <vitamins/mains_sockets.scad>
|
||||
include <vitamins/modules.scad>
|
||||
include <vitamins/panel_meters.scad>
|
||||
include <vitamins/photo_interrupters.scad>
|
||||
include <vitamins/pillars.scad>
|
||||
include <vitamins/pillow_blocks.scad>
|
||||
include <vitamins/pin_headers.scad>
|
||||
@@ -100,3 +101,4 @@ use <utils/round.scad>
|
||||
use <utils/offset.scad>
|
||||
use <utils/sector.scad>
|
||||
use <utils/thread.scad>
|
||||
use <vitamins/photo_interrupter.scad>
|
BIN
libtest.png
BIN
libtest.png
Binary file not shown.
Before Width: | Height: | Size: 0 B After Width: | Height: | Size: 974 KiB |
@@ -85,6 +85,7 @@ use <tests/o_ring.scad>
|
||||
use <tests/opengrab.scad>
|
||||
use <tests/panel_meters.scad>
|
||||
use <tests/PCBs.scad>
|
||||
use <tests/photo_interrupters.scad>
|
||||
use <tests/pillars.scad>
|
||||
use <tests/pillow_blocks.scad>
|
||||
use <tests/potentiometers.scad>
|
||||
@@ -428,6 +429,9 @@ translate([x3 + 60, modules_y])
|
||||
translate([x3 + 90, modules_y])
|
||||
modules();
|
||||
|
||||
translate([x3 + 150, modules_y])
|
||||
photo_interrupters();
|
||||
|
||||
translate([x3, ssrs_y]) {
|
||||
ssrs();
|
||||
|
||||
|
55
readme.md
55
readme.md
@@ -42,12 +42,12 @@ A list of changes classified as breaking, additions or fixes is maintained in [C
|
||||
<tr><td> <a href = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#PCBs">PCBs</a> </td><td> <a href = "#Terminals">Terminals</a> </td><td> <a href = "#PSU_shroud">PSU_shroud</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusions">Extrusions</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td> <a href = "#Pocket_handle">Pocket_handle</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#Panel_meters">Panel_meters</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td> <a href = "#Press_fit">Press_fit</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fastons">Fastons</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td> <a href = "#Printed_box">Printed_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Pillow_blocks">Pillow_blocks</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Printed_pulleys">Printed_pulleys</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Potentiometers">Potentiometers</a> </td><td> <a href = "#Washers">Washers</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Wire">Wire</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td></td><td> <a href = "#Zipties">Zipties</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Fastons">Fastons</a> </td><td> <a href = "#Photo_interrupters">Photo_interrupters</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td> <a href = "#Printed_box">Printed_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Printed_pulleys">Printed_pulleys</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#Pillow_blocks">Pillow_blocks</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Washers">Washers</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Potentiometers">Potentiometers</a> </td><td> <a href = "#Wire">Wire</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Zipties">Zipties</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td></td><td></td><td></td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||
</table>
|
||||
|
||||
@@ -2754,6 +2754,49 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 4 | pcb_spacer4090.stl |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Photo_interrupters"></a>
|
||||
## Photo_interrupters
|
||||
Photo interrupter modules popular in robot kits and from China.
|
||||
|
||||
[vitamins/photo_interrupters.scad](vitamins/photo_interrupters.scad) Object definitions.
|
||||
|
||||
[vitamins/photo_interrupter.scad](vitamins/photo_interrupter.scad) Implementation.
|
||||
|
||||
[tests/photo_interrupters.scad](tests/photo_interrupters.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `pi_base_height(type)` | Height of the base |
|
||||
| `pi_base_length(type)` | Length of the base |
|
||||
| `pi_base_width(type)` | Width of the base |
|
||||
| `pi_color(type)` | Color of photo interrupter |
|
||||
| `pi_gap_height(type)` | Height of the gap where the light can be interrupted |
|
||||
| `pi_gap_width(type)` | Width of the gap |
|
||||
| `pi_hole_diameter(type)` | Diameter of the mounting holes |
|
||||
| `pi_pcb(type)` | Parameter for the support PCB, created with pi_pcb |
|
||||
| `pi_stem_width(type)` | Width of the stems |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `photo_interrupter(type)` | Draw the photo interrupter, with PCB |
|
||||
| `pi_cutout(type)` | Shape to subtract for fitting a photo interrupter |
|
||||
| `pi_hole_locations(type)` | Locations of photo interrupter mounting holes |
|
||||
| `pi_pcb(type)` | Draw the support PCB |
|
||||
| `pi_pcb_hole_locations(pcb)` | Locations of the PCB holes |
|
||||
|
||||

|
||||
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `photo_interrupter(PH1)` | PH1 Photo interrupter |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
|
28
tests/photo_interrupters.scad
Normal file
28
tests/photo_interrupters.scad
Normal file
@@ -0,0 +1,28 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2023
|
||||
// nop.head@gmail.com
|
||||
// hydraraptor.blogspot.com
|
||||
//
|
||||
// This file is part of NopSCADlib.
|
||||
//
|
||||
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
// See the GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
include <../vitamins/photo_interrupters.scad>
|
||||
|
||||
use <../utils/layout.scad>
|
||||
|
||||
module photo_interrupters()
|
||||
layout([for(l = photo_interrupters) pi_base_length(l)], 5, true)
|
||||
photo_interrupter(photo_interrupters[$i]);
|
||||
|
||||
photo_interrupters();
|
BIN
tests/png/photo_interrupters.png
Normal file
BIN
tests/png/photo_interrupters.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 50 KiB |
103
vitamins/photo_interrupter.scad
Normal file
103
vitamins/photo_interrupter.scad
Normal file
@@ -0,0 +1,103 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2023
|
||||
// nop.head@gmail.com
|
||||
// hydraraptor.blogspot.com
|
||||
//
|
||||
// This file is part of NopSCADlib.
|
||||
//
|
||||
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
// See the GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
//
|
||||
//! Photo interrupter modules popular in robot kits and from China.
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
include <../utils/rounded_polygon.scad>
|
||||
|
||||
function pi_base_width(type) = type[1]; //! Width of the base
|
||||
function pi_base_length(type) = type[2]; //! Length of the base
|
||||
function pi_base_height(type) = type[3]; //! Height of the base
|
||||
function pi_gap_height(type) = type[4]; //! Height of the gap where the light can be interrupted
|
||||
function pi_gap_width(type) = type[6]; //! Width of the gap
|
||||
function pi_stem_width(type) = type[5]; //! Width of the stems
|
||||
function pi_hole_diameter(type) = type[7]; //! Diameter of the mounting holes
|
||||
function pi_color(type) = type[8]; //! Color of photo interrupter
|
||||
function pi_pcb(type) = type[9]; //! Parameter for the support PCB, created with pi_pcb
|
||||
|
||||
module pi_hole_locations(type) { //! Locations of photo interrupter mounting holes
|
||||
translate([0, -(pi_base_length(type) - pi_base_width(type)) / 2, 0])
|
||||
children();
|
||||
translate([0, (pi_base_length(type) - pi_base_width(type)) / 2, 0])
|
||||
children();
|
||||
}
|
||||
|
||||
module pi_pcb_hole_locations(pcb) { //! Locations of the PCB holes
|
||||
for (xy = pcb[7]) {
|
||||
translate([xy[0], xy[1], 0])
|
||||
children();
|
||||
}
|
||||
}
|
||||
|
||||
module pi_pcb(type) { //! Draw the support PCB
|
||||
pcb = pi_pcb(type);
|
||||
color(pcb[6]) {
|
||||
translate([0, 0, -pcb[2]]) {
|
||||
linear_extrude(pcb[2]) {
|
||||
difference() {
|
||||
rounded_polygon([[0, -(pi_base_length(type) - pi_base_width(type)) / 2, -pi_base_width(type) / 2],
|
||||
[pi_base_width(type) / 2, -pcb[1]/2, eps],
|
||||
[pcb[0]+1, -pcb[1]/2, eps],
|
||||
[pcb[0]+1, pcb[1]/2, eps],
|
||||
[pi_base_width(type) / 2, pcb[1]/2, eps],
|
||||
[0, (pi_base_length(type) - pi_base_width(type)) / 2, -pi_base_width(type) / 2]
|
||||
]);
|
||||
pi_pcb_hole_locations(pcb)
|
||||
circle(d = pcb[8]);
|
||||
pi_hole_locations(type)
|
||||
circle(d=pi_hole_diameter(type));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module photo_interrupter(type) { //! Draw the photo interrupter, with PCB
|
||||
vitamin(str("photo_interrupter(", type[0], "): ", type[0], " Photo interrupter"));
|
||||
color(pi_color(type)) {
|
||||
linear_extrude(pi_base_height(type)) {
|
||||
difference() {
|
||||
hull() {
|
||||
pi_hole_locations(type)
|
||||
circle(d = pi_base_width(type));
|
||||
}
|
||||
pi_hole_locations(type)
|
||||
circle(d = pi_hole_diameter(type));
|
||||
}
|
||||
}
|
||||
translate([-pi_base_width(type)/2, -(pi_gap_width(type)/2 + pi_stem_width(type)), 0])
|
||||
cube([pi_base_width(type), pi_stem_width(type), pi_gap_height(type) + pi_base_height(type)]);
|
||||
translate([-pi_base_width(type)/2, pi_gap_width(type)/2, 0])
|
||||
cube([pi_base_width(type), pi_stem_width(type), pi_gap_height(type) + pi_base_height(type)]);
|
||||
}
|
||||
pi_pcb(type);
|
||||
}
|
||||
|
||||
module pi_cutout(type) { //! Shape to subtract for fitting a photo interrupter
|
||||
hull() {
|
||||
pi_hole_locations(type)
|
||||
cylinder(h = pi_base_height(type), d = pi_base_width(type));
|
||||
}
|
||||
translate([-pi_base_width(type)/2, -(pi_gap_width(type)/2 + pi_stem_width(type)), 0])
|
||||
cube([pi_base_width(type), pi_stem_width(type), pi_gap_height(type) + pi_base_height(type)]);
|
||||
translate([-pi_base_width(type)/2, pi_gap_width(type)/2, 0])
|
||||
cube([pi_base_width(type), pi_stem_width(type), pi_gap_height(type) + pi_base_height(type)]);
|
||||
};
|
23
vitamins/photo_interrupters.scad
Normal file
23
vitamins/photo_interrupters.scad
Normal file
@@ -0,0 +1,23 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2023
|
||||
// nop.head@gmail.com
|
||||
// hydraraptor.blogspot.com
|
||||
//
|
||||
// This file is part of NopSCADlib.
|
||||
//
|
||||
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
// See the GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
PH1 = ["PH1", 6.4, 25.9 , 3.5, 8.6, 4.1, 5.9, 3, grey(20), [22, 20, 1.6, true, 11-3.2, 0, "blue",[[8.3, -7.5], [8.3, 7.5]], 3]];
|
||||
|
||||
photo_interrupters = [PH1];
|
||||
|
||||
use <photo_interrupter.scad>
|
Reference in New Issue
Block a user