OpenSCAD: vincularlo al casco ()
¿Cuál es su comando OpenSCAD favorito? Tal vez lo sea intersection()
o difference()
? O eres tu polygon()
y extrude()
¿modelador? Para mí, la función más útil, y quizás más a menudo pasada por alto, es hull()
. Hull()
hace exactamente lo que dice en la lata, crea un casco convexo alrededor de los objetos que se le entregan como niños, pero eso resulta ser invaluable.
Hull()
resuelve algunos problemas nuevos: redondear y conectar cosas. Y con un poco de ingenio hull()
puede proporcionar una estrategia de modelado casi completa por sí solo. Si usa OpenSCAD y sus creaciones tienen bordes duros, o pasa demasiado tiempo averiguando ángulos, o si solo desea experimentar otra forma de hacer el trabajo, ¡siga leyendo!
La caja redonda
Hay muchas formas de hacer una caja redonda. Uno es dibujar una caja en 3D y
minkowski()
alrededor con un cilindro adecuado. Otro método que se está volviendo mucho más rápido es dibujar un cuadrado 2D, offset()
con bordes redondeados, y sobresalen hacia arriba. Incluso he visto a gente hacer herramientas redondas y diferenciarlas del modelo.
Para mí, el método más intuitivo es poner los cuatro cilindros que serían los bordes redondos de la caja, y conectarlos todos con hull()
. Si nunca entendiste realmente hull()
antes, este es un gran lugar para comenzar.
Hull()
toma cualquier número de objetos y construye su casco convexo; la acción se asemeja a un helado apretado alrededor de las formas y solidifica el resultado. Para hacer la caja redondeada prometida, tome el hull()
sobre cuatro cilindros, uno ubicado en cada uno de los cuatro bordes. No hay mucho más que decir al respecto, ¿verdad?
points = [ [0,0,0], [10,0,0], [0,10,0], [10,10,0] ]; module rounded_box(points, radius, height){ hull(){ for (p = points){ translate(p) cylinder(r=radius, h=height); } } }
¡Claro, hay más! Triángulos redondeados, hexágonos, heptágonos, octágonos y otras gónadas. Y tampoco hay razón para regularlo, simplemente cambie los puntos de ángulo. Pero quizás la aplicación simple más útil de hull()
para mí hizo extremos redondos en placas, varillas o eslabones.
module cylinders(points, diameter, thickness){ for (p=points){ translate(p) cylinder(d=diameter, h=thickness, center=true); } } module plate(points, diameter, thickness, hole_diameter){ difference(){ hull() cylinders(points, diameter, thickness); cylinders(points, hole_diameter, thickness+1); } } module bar(length, width, thickness, hole_diameter){ plate([[0,0,0], [length,0,0]], width, thickness, hole_diameter); }
Armado por bar()
y plate()
, y las dimensiones de todas las partes en un enlace de Jansen, por ejemplo, usted es principalmente de un Strandbeest imprimible. Observe lo agradable que es el flujo de trabajo: averigüe dónde necesita sus agujeros, escríbalos en un vector de puntos y OpenSCAD se encarga del resto. Gracias hull()
!
Unir objetos juntos
¡Pero espera hay mas! En los ejemplos anteriores de barras y placas, todos los puntos están limitados a un plano. Si necesita una placa de montaje tridimensional compleja, solo tiene que empujar los puntos a la tercera dimensión y limpiar después del desorden que acaba de crear.
points = [ [0,0,0], [40,0,0], [23,-10,0], [60,19,10] ]; difference(){ plate(points, 10, 1, 5.5); for (p=points){ translate(p + [0,0,1]) cylinder(d1=10, d2=15, h=7); translate(p + [0,0,-1]) mirror([0,0,1]) cylinder(d1=10, d2=15, h=7); } }
Mover un punto fuera de un avión
Quitar los agujeros
Espejo para el lado inferior
Una vez que empiece a pensar en usarlo hull()
para conectar objetos ubicados arbitrariamente en el espacio 3D, controlas en el camino, y podemos dejar placas de montaje simples. Por ejemplo, destaqué una lámpara de planta de proyección de aluminio 20/20 con solo algunas formas simples y algunas hull()
.
Las patas de la lámpara tienen que estar unidas a la proyección en algún lugar, así que comencé con un cubo de 25 mm, perforado con el perfil. Luego, los pies tienen que tocar el suelo, así que coloqué dos cubos más (delgados) lo suficientemente separados para que pudieran acomodar la maceta de la planta. Cada pie es individual hull()
hacia el bloque central, el modelo ha girado y está fuera de la impresora. Como ya había descubierto el perfil de extrusión, todo el proyecto tomó menos de quince minutos. La impresión duró unas cinco horas.
Hull()
guardado de nuevo en un problema de proyecto muy similar que podría verse completamente diferente en la superficie. Se rompió un trozo del soporte de la luz de mi bicicleta. Para la pestaña que se ajusta a la luz, haría un simple cubo, y atornillaría la abrazadera en el soporte del asiento solo necesitaba un agujero. Pero, ¿cómo conectar el agujero con el cubo, sin preocuparse demasiado por la forma?
El único refinamiento aquí es que el hull()
no puedo envolver toda la pestaña de montaje porque no entraría en la ranura de la luz, así que hice una plataforma de aterrizaje para otro cubo a partir de otro cubo simple, que se muestra aquí en rojo.
A continuación, se muestra una estrategia general: coloque los objetos que le gustaría juntar en el espacio 3D, inserte un aterrizaje en cada uno de los objetos y hull()
juntos, en parejas o en grupos, según corresponda. La forma de las pistas de aterrizaje determina la forma del conector y los resultados de hull()
sobre objetos 3D y el espacio a menudo puede ser sorprendente y, a menudo, sorprendentemente elegante, por lo que querrá experimentar. Pero una vez que te acostumbraste a pensar en hull()
como conector de uso general, encontrará usos para esta técnica en todas partes.
Extendiendo, Creando
Con algunas funciones de ayuda, puede crear modelos con hull()
un poco más fácil. Por ejemplo, en el ejemplo anterior de una lámpara, necesitábamos hull()
un pie junto con el bloque central, y luego repita la acción para el otro pie:
hull(){ mount_block(); foot_block(1); } hull(){ mount_block(); foot_block(-1); }
¡Tanta duplicación! Eso no funcionará. Del mismo modo, si desea crear formas orgánicas, lo encontrará conveniente. hull()
objetos juntos secuencialmente en una cadena, en lugar de todos juntos en una bola.
module multiHull(){ for (i = [1 : $children-1]) hull(){ children(0); children(i); } } module sequentialHull(){ for (i = [0: $children-2]) hull(){ children(i); children(i+1); } }
Ambas funciones aprovechan la
children()
un dispositivo que le permite insertar subobjetos en un módulo personalizado. multiHull()
se ocupa de la situación de la lámpara; eso hull()
s el primer objeto hijo en parejas con cada uno de los demás. sequentialHull()
conecta el primer objeto con el segundo, el segundo con el tercero, y así sucesivamente.
La única limitación de estas funciones es que no pueden aceptar objetos. internamente a for()
bucle como niños, porque for()
los bucles en OpenSCAD terminan con el valor predeterminado union()
comando, uniendo todos los elementos del bucle en una sola pieza. Esto significa que, en algunos casos, terminará escribiendo el for()
y hull()
sale explícitamente por sí mismo. Todavía encuentro útiles estas funciones. Por ejemplo, aquí está el código del pie de la lámpara:
multiHull(){ mount_block(); foot_block(1); foot_block(-1); }
Para exponer estas características, hagamos una base de PCB de uso general, el tipo de cosa que desea debajo de casi cualquier dispositivo de placa base si tiene pequeñas piezas de metal flotando en su escritorio, por ejemplo. Comenzando con la ubicación de los orificios de montaje (¡adelante, adelante, calibres gruesos!), multiHull()
unos cilindros unidos con un punto central para hacer una cruz que los une a todos. Si quieres algo más grande, puedes usar sequentialHull()
Redondea esos puntos en un anillo, formando un borde cuadrado. Y finalmente, si también desea que las paredes de amortiguación muevan completamente la PCB, cree dos cajas redondeadas hull()
ing cilindros y tomando su diferencia. Mira el código: se acabó hull()
, cylinder()
, y difference()
.
Toda la hull()
funciones aquí, y algunas más, están en un hull.scad
archivo para que pueda incluirlos en sus proyectos con un simple use <hull.scad>
en la parte superior de su código. Si usa OpenSCAD, pero no es completamente aceptado hull()
como una estrategia de modelado útil, espero que esta edición lo ayude a guiarlo en la dirección correcta con algunas plantillas de proyecto útiles. ¡Disfrutar!
Ren dice:
Gracias, estoy a punto de descargar OpenSCAD, es bueno ver algunos códigos existentes con explicaciones.
Jerjes tercero dice:
minkowski () es mi característica favorita, es excelente para agregar archivos a los bordes.
apatía perdida dice:
minkowski () es una espada afilada: es útil para suavizar los bordes, pero también es un gran éxito cuando se usa demasiado.
Elliot Williams dice:
¡Estoy de acuerdo con ambos!
Una gran característica que uso mucho para crear archivos entre dos partes, hace trucos realmente geniales con sumas y uniones minkowski:
https://github.com/clothbot/ClothBotCreations/blob/master/utilities/fillet.scadPero eso sí, con modelos complicados dificulta el tiempo de compilación. Pero eso es algo que haces una vez por modelo de todos modos. ¿Uno o dos minutos excepto por algo que será una impresión de varias horas? No hay problema.
sneakypoo dice:
Mi experiencia con OpenSCAD a lo largo de los años es que, por lo general, se bloquea en unos 5-60 minutos cada vez que intento usarlo. Lo he probado varias veces durante los últimos 5-6 años, en diferentes computadoras y diferentes versiones de Windows y la experiencia es siempre la misma.
Dicho esto, parece una buena característica. Es como un cruce entre un porro booleano y una operación de ático por completo.
TGT dice:
¿Bienvenido al diseño 3d? Pensé que todos aceptamos esto y configuramos un protector de archivos incremental automático.
Mella dice:
Habla por ti mismo. No me siento bien con el software basura, solo porque es común.
Dicho esto, no tuve problemas con el bloqueo de la versión actual.
Sin embargo, no trabajo con objetos supercomplejos, así que YMMV.Ostraco dice:
Imagínense HaD chocando tan a menudo. Estoy seguro de que una solución ejecutaría dos navegadores a la vez.
FriendlyFrob dice:
No tengo problemas con un bloqueo de OpenSCAD, pero aquí hay algunos consejos increíbles:
¡No edite su código en OpenSCAD! Su editor, sin embargo, no es muy bueno. Utilice su editor de código externo favorito y active Proyecto => Recargar y compilar automáticamente. Luego, personalice la ventana de OpenSCAD como se indicó anteriormente, si su sistema operativo lo admite, o coloque en mosaico el editor de texto y las ventanas de OpenSCAD. Sublime tiene un paquete para la sintaxis OpenSCAD y apuesto a que también VSCode o Atom. ¡No más trabajo perdido!
https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_an_external_Editor_with_OpenSCAD
Daren Schwenke dice:
+1
Yo también trabajo así y no tengo problemas con las caídas.Pholat dice:
Utilizo openscad en casa en Linux en Macbook y, a veces, en Windows y nunca se bloqueó. También utilizo un editor externo y git para el verificador de versiones y funciona a las mil maravillas. Aunque a veces en Linux detiene la visualización en vivo por alguna razón.
Usé freecad la mayor parte del tiempo, pero se ha vuelto tan inestable que ahora no vale la pena para míSr. Nombre Requerido dice:
Nunca tuve una clave OpenSCAD en Windows, pero FreeCAD y SolveSpace ciertamente la tenían cuando traté de generar DXF importado desde un juego de herramientas. OpenSCAD no tuvo ningún problema. Renuncié a SolveSpace debido a sus diálogos de mensajes de error terriblemente punitivos.
RB dice:
No puedo decir que haya tenido quejas sobre OpenSCAD también a través de muchas versiones durante algunos años. Si dejo algunos proyectos abiertos durante algunas semanas (sí, semanas. Otras prioridades) eventualmente tendré problemas de memoria. Sin embargo parece más en relación a los malos videos.
Iglú dice:
¿Lo ejecutas en Windows? No tengo este problema al ejecutarlo en Linux. ¿Quizás esa es la diferencia?
pelusa dice:
Funcionó bien en Win10 para mí. Versión 2015.03-2 si es diferente.
Tom Nardi dice:
No puedo pensar en un momento en el que OpenSCAD se haya bloqueado para mí, y lo he usado casi exclusivamente para todo mi proyecto 3D durante los últimos dos años.
Aunque puede ser un problema de Windows. Ha pasado mucho tiempo desde que usé este OS.
Elliot Williams dice:
Solía fallar mucho en 2014. Hubo problemas con las librerías ascendentes. Creo que pasó todo. ¿Quizás tienes una versión antigua?
Estoy usando Linux, un editor externo, v.2015.03, y es sólido.
Tú quieres dice:
¿Enlace? ¿En serio?
Ren dice:
¡Todo el mundo sabe que se escribe tailandés!
Elliot Williams dice:
"Vincular" es aparentemente arcaico y no se recomienda, pero lo he escrito de esa manera toda mi vida. (Aunque no soy tan viejo. Ha pasado un siglo).
Si está bien, lo dejo así: somos como el número 5 debido a errores ortográficos en los motores de búsqueda. Pero lo deletrearé a tu nueva manera en el futuro.
Max dice:
Esa base insonorizada con los cables colgando. Tengo algunos de estos y los guardo en una caja con cierta tensión segura. Por favor haz lo mismo.
smerrett79 dice:
Gracias Elliot, eso hace, por ejemplo, El comando de Onshape a continuación parece incómodo.
Steven Clark dice:
Por alguna razón, he descubierto que un casco es más eficaz para trabajar con esferas que cualquier otra técnica. Pero solo he hecho una cosa (hexadecimal general con una flecha para juegos de mesa) con OpenSCAD hasta ahora y fue hace algún tiempo. Creo que algunas otras técnicas implicaron la creación repetida de un conjunto de geometría derrochando.
Daren Schwenke dice:
Diferenciar dos cascos del mismo objeto con un tamaño de compensación es mi forma favorita de generar pieles complejas. De hecho, lo elogié anoche: https://la-tecnologia.io/project/45404-arcus-3d-p1-pnp-for-3d-printers/log/91569-mirror-arm-done
minkowski () y hull () ambos * realmente * disminuyen la velocidad si usa una esfera () como sus esquinas. Cíñete al cilindro () y al cubo () y las cosas corren 10 veces más rápido.Elliot Williams dice:
¡Esa es una hermosa modelo!
Podría llamar a mi artículo "En OpenSCAD, el casco es tu amigo". y ahorré mucho tipeo ...
Tommy dice:
Aquí hay un gran resumen de hull (), ¡con el que necesitaba un empujón para sentirme más cómodo! niños () también
Mi único truco de hull () es hacer una "protuberancia trasladada", es decir, un cubo con su plano superior o inferior en un XY diferente, lo que una protuberancia normal no puede hacer porque solo va hacia arriba, pelando entre dos cubos de altura nominal y traducciones de diferentes puestos. Esto es mucho más fácil que escribir la matriz XYZ completa para un poliedro.
¡y voilá! https://twitter.com/oskitone/status/928432714314760192
Sr. Nombre Requerido dice:
Aquí hay algo que uso con bastante frecuencia, que creo que es un buen ejemplo del uso de niños ():
módulo Radios (n)
{
segmento = 360 / n;
por (i =[1:n])
{
turni[0, 0, segment*i])
turni[90, 0, 0])
niños ();
}
}// Esto crea el número dado de radios para, por ejemplo, una rueda, por ejemplo, tres cilindros de radios:
Radios (3)
cilindro (r = SPOKE_RAD, h = SPOKE_LEN);Elliot Williams dice:
Los niños () son excelentes para crear "operadores" que multiplican, posicionan o modifican otros objetos. ¡Estos son ejemplos asombrosos!
Mi única queja es que no puedes pasar a los niños en un bucle (), lo que a menudo quiero hacer porque me gusta el flujo de trabajo define-a-set-of-decision-points. Así que a menudo termino cortando / pegando donde podría reutilizar. Sin embargo, no es genial, pero no es "correcto".
Sin embargo, entre el curling, los niños y algunas de las técnicas de modelado “avanzadas” como el casco y demás, OpenSCAD es mucho más poderoso de lo que mucha gente cree.
Sr. Nombre Requerido dice:
De acuerdo de todo corazón, es muy poderoso incluso si lleva algún tiempo ajustar el código.
Una cosa que realmente me gustaría (dime si está disponible y me lo perdí) son los diálogos de entrada y salida simples.
Por ejemplo,
Entrada ("Cuántos lados para su polígono" ", lados);
configuraría un cuadro de mensaje Aceptar / Cancelar con esa cadena y campo de edición, y esperaría la entrada.
y
Exit ("su polígono tiene $ {0} lados", lados);
(no el mensaje que va a la ventana de la consola de salida, sino un cuadro de diálogo de buzón modal apropiado).
Un poco similar a la configuración de thingiverse, pero solo en OpenSCAD.Daren Schwenke dice:
Suena como el desafío perfecto de Google Summer of Code.
Me imagino que sería trivial descifrar un script de Python que también hace lo mismo por sustitución.
Luke Ruppersburg dice:
¿Podrías usar la poda después de la extrusión o no entiendo bien lo que estás haciendo?
Thorsten dice:
¿Alguien sabe dónde hay un registro de cambios donde puedo ver las diferencias entre la última instantánea estable y la última instantánea del desarrollador? El establo es bastante antiguo y quería comprobarlo, a primera vista se ve exactamente igual ...
Daren Schwenke dice:
Utilice la versión de desarrollo.
No se irá con un establo hasta que encuentre las opciones faltantes que desea, y luego descubrirá que ya se han implementado en dev. La versión de desarrollo en mi experiencia fue completamente estable. Utilice su propio editor como se indicó anteriormente.Thorsten dice:
He estado usando la parada estable intensa durante años y el único gran problema que tengo es la renderización stl de un solo núcleo, que duele mucho con algunos modelos que tengo. Esto no ha mejorado que yo sepa. Y desde que abrí la versión para desarrolladores y un vistazo rápido, no encontré ningún cambio importante. Entonces, ¿hay probablemente nuevos comandos u opciones para los antiguos? Pero sin documentación es difícil de encontrar. Tengo un poco de miedo de hacer git diff y mirar las fuentes, pero me pregunto (-:
Daren Schwenke dice:
Acabo de revisar mi copia de desarrollo y el renderizado parece ser todavía un solo núcleo. O al menos así es como lo manejo.
Los cambios que vienen en la memoria son opciones adicionales en linear_extrude () y rotate_extrude (). En cuanto a rotate_extrude (), ahora puede especificar un ángulo en lugar de tener que diferenciar su resultado. Están documentados en la ayuda en línea. Como parece que "simplemente funciona" y tiene cosas útiles agregadas, no encontré ninguna razón para no usar la versión dev.
Taper Wickel dice:
Hace unos años, estaba trabajando en un paquete para hacer letras superpuestas y en relieve con fuentes Hershey, y hull () para juntar esferas fue el método que encontré. Funcionó, aunque como se mencionó, esto puede ser un verdadero éxito. Creo que dejé el proyecto cuando los paquetes de fuentes apropiados estuvieron disponibles. Sin embargo, hay algo hermoso en la apariencia de letras aparentemente grabadas en el material, donde se puede establecer una escala independientemente del "tamaño de herramienta" de las esferas subyacentes.
Elliot Williams dice:
Si puede tener éxito, en cuanto a los signos, use cilindros en lugar de esferas. El número de pares de borde a borde es N ^ 2 con cilindros, pero N ^ 3 con esferas.
O simplemente prepare una taza de té durante el tiempo de compilación como en los viejos tiempos.
Kristina Panos dice:
Eso tenía que ser frente a una espada peleando en sillas de oficina.
Rodney Majola dice:
Gran artículo, gracias. Estoy probando estas ideas en mi rastreador de líneas que estoy construyendo
Puñal dice:
Encontré chainedHull () en un wikibook openSCAD, que es básicamente su sequentialHull (), pero no pensé en multiHull (). Será una adición útil, gracias.