Creazione programmatica di righe di punti radianti


17

Voglio creare un modello di fori per gli altoparlanti in questo modo: inserisci qui la descrizione dell'immagine

Ma non sono sicuro da dove cominciare. Ciò può essere ottenuto senza un posizionamento laborioso in Illustrator o software simile?


Sarebbe banale usare qualcosa come Python per creare un SVG con punti posizionati / dimensionati correttamente, quindi aprire l'SVG in Illustrator, salvare nuovamente come .ai e andare da lì.
Superbo

Trivial ha ragione. Scrivi una trasformazione da polare a cartesiana, quindi anelli annidati, un raggio di avanzamento e l'altro angolo di avanzamento. Nel tuo esempio il passo angolare è di 9 gradi o PI / 10.
Peter finito il

Risposte:


9

Aggiungerò il mio metodo, poiché mi sembra che sia il più semplice. Fondamentalmente, tu:

  1. Generare computazionalmente i cerchi in Python
  2. Renderli come un semplice file SVG
  3. Apri il file in Illustrator

Ecco lo script Python (richiede svgwritee math):

"""
This script has two purposes:

- Simple demonstration of using Python (specifically the svgwrite library) to create an SVG file
- Answer the question http://graphicdesign.stackexchange.com/q/56200/21332
"""

# n[x] should give the number of circles at a distance of (x+1)*d from the center
d = 30
n = [8, 16, 20, 20, 20]

r = 7  # radius of each circle

# Calculate the center points of each circle
circles = [(0, 0)]  # There is always one circle in the middle

import math
for i in range(0, len(n)):
    m = n[i]  # m is the number of circle in this "row", i is the number of the row
    for j in range(0, m):  # for each circle...
        phi = 2*math.pi*j/m  # Calculate the angle at which the circle will be

        # Convert polar coordinates to cartesian
        x = d*(i+1)*math.cos(phi)
        y = d*(i+1)*math.sin(phi)

        circles.append((x, y))

# Write circles to SVG
import svgwrite

# Determine correct size of drawing
width = max([c[0] for c in circles])*2.2
height = max([c[1] for c in circles])*2.2

dwg = svgwrite.Drawing('demo.svg', size = (width, height))  # output will be in the same folder as this script

# offsets for shifting all circles so that the SVG can be easily viewed in browser
x_offset = min([c[0] for c in circles])*1.1
y_offset = min([c[1] for c in circles])*1.1

for c in circles:
    adjusted_x = c[0] - x_offset
    adjusted_y = c[1] - y_offset

    dwg.add(svgwrite.shapes.Circle((adjusted_x, adjusted_y), r))

# Save the file
dwg.save()

# Print SVG source to console
print(dwg.tostring())

Creerà un file SVG nella directory in cui si trova. Puoi aprirlo in un browser:

inserisci qui la descrizione dell'immagine

O in Illustrator:

inserisci qui la descrizione dell'immagine

Dovresti usare una finestra Illustrator più grande di me, anche se la mia era un po 'troppo piccola per lavorare comodamente ...

Se non puoi avere gli script Python per creare file (magari eseguendolo in un interprete Python online), commenta semplicemente dwg.save(). L'ultima riga stampa il contenuto di SVG sulla console, è possibile incollarlo nel Blocco note, quindi salvare come my file.svg.

Mi sono lasciato trasportare e ho aggiunto alcune funzionalità "pulite", come:

  • Assicurati che i cerchi siano centrati correttamente, in modo che i cerchi con coordinate negative non vengano troncati durante la visualizzazione nel tuo browser.
  • Ridimensiona la tela SVG.

Potresti facilmente lasciarli fuori, poiché Illustrator non nasconde oggetti al di fuori dei limiti della tela e ti consente di ridimensionare la tela manualmente:

inserisci qui la descrizione dell'immagine


16

In realtà non si specifica se l'immagine è qualcosa che ti sei generato o meno in TK, che hai a portata di mano o meno. Se disponi già di questo codice, puoi esportare la tela delle applicazioni TK come EPS e aprirla in Illustrator. Tutto quello che devi fare è chiamare canvas.postscript().

Se vuoi usare TK

Esempio semplice in Python 2:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from Tkinter import *
import math

def circle(c, x, y, r=10):
    return c.create_oval(x-r, y-r, x+r, y+r, width=0, fill="black")

def draw_circles(c, num, r):
    step = (2.0*math.pi)/float(num)
    for i in range(num):
        x = 400 + r * math.sin(i*step)
        y = 400 + r * math.cos(i*step)
        circle(c, x, y)


main_window = Tk()
main_window.title('Pattern to EPS')
canvas = Canvas(main_window,
                    width=800, height=800, 
                    bg = 'white')

circle(canvas, 400, 400)
for i in range(1, 6):
    draw_circles(canvas, i*8, i*60)

canvas.pack()

# next line generates a eps file
canvas.postscript(file = "pattern.eps",  width=800, height=800 )

# uncomment next line if you want to see the tk window
# main_window.mainloop()

Ciò si traduce in un file denominato "patten.eps".

risultato di pattern.eps

Immagine 1 : apertura dell'EPS generato in Illustrator.

Puoi farlo in extayScript, SVG o direttamente scrivendo il programma EPS, tutti facili da fare (vedi l'appendice sotto per alcuni esempi). Vedi i seguenti post per le risorse:

PS : Non so se valga la pena scrivere script in quanto ci vogliono circa 3 minuti per attirarli con l'aiuto dello strumento di rotazione e Ctrl+D

Miscela parametrica in Illustrator

  1. Disegna un cerchio.
  2. duplicalo.
  3. fondere i cerchi
  4. disegna un altro cerchio che rappresenta la colonna vertebrale, taglialo in un punto
  5. Seleziona sia fusione che cerchio e fai Oggetto → Miscela → Sostituisci dorso
  6. regola il numero di sfere con Oggetto → Fusione → Opzioni di fusione ... meno un oggetto.
  7. Copia e regola le dimensioni e le opzioni dei cerchi spne. fatto

un anello

Immagine 2 : un anello con il metodo sopra


Appendice 1: con EPS scritto manualmente

%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 800 800
%%Title: pattern
%%Creator: joojaa
%%CreationDate:  2015-07-08
%%EndComments

/c {newpath 10 0 360 arc closepath fill} def
/cr {
    dup 8 mul 2 dict begin /i exch def /r exch 60 mul def 
    1 1 i {360 i div mul dup sin exch cos r mul exch r mul c} for 
    end
} def

400 400 translate
0 0 c
1 1 6 {cr} for
%%EOF

Appendice 2: esempio di ExtendScript

#target illustrator

var doc = app.activeDocument; 

function circle(x,y) {
    doc.pathItems.ellipse(x+5,y-5,10,10);
}

function draw_circles(num, r){
    var step = (2.0*Math.PI)/num;
    for (var i = 0; i < num; i++) {
        var x = -200 + r * Math.sin(i*step);
        var y = 200 + r * Math.cos(i*step);
        circle(x, y);
    }
}

circle(-200,200);
for (var i = 1; i <= 6; i++) {
    draw_circles(i*8, i*30);
}

Grazie - Non ho la finestra di tk, era solo un esempio del modello che ho trovato
Tom

1
@ Tom Ecco perché ho elencato delle alternative.
joojaa,

1
Hah, è fantastico, ho letto da qualche parte che PostScript è Turing completo, ma non ho mai visto nessuno in realtà codice prima.
Peter finito il

9

Se non ti interessano i punti in fila ...

Puoi creare rapidamente qualcosa di simile al tuo esempio in Illustrator usando un tratto tratteggiato. Per disegnare facilmente gli anelli equidistanti, utilizzerei lo strumento griglia polare .

Opzioni dello strumento griglia polare Risultato dello strumento griglia polare

Quindi è solo una questione di impostare il tratto sugli anelli a tratteggiato con spazi che si adattano ai tuoi gusti:

Opzioni del pannello Traccia file di punti radianti

Puoi ovviamente mettere a punto ogni riga per aggiungere più punti, se necessario, basta aumentare o diminuire il valore del gap individuale. Con la casella gap attiva, è possibile utilizzare la rotella di scorrimento per modificare rapidamente il valore. Tenere Ctrl / Cmdpremuto durante lo scorrimento per regolare con incrementi più fini

Opzioni del pannello Traccia file di punti radianti

Un problema con questo metodo è che potrebbero esserci delle sovrapposizioni in alcuni punti:

punto si sovrappongono

Potrebbe essere necessario modificarli manualmente se ne hai bisogno per essere perfetti. Dovrebbe esserci al massimo 1 sovrapposizione per riga.


1
Bene, la fusione è migliore per l'allineamento duro
joojaa

1
È una griglia per altoparlanti, o sta per serigrafarlo su un po 'di alluminio e perforare manualmente ogni segno nel qual caso un segno leggermente largo non avrà importanza o si convertirà in DXF e utilizzerà un mulino a controllo numerico, nel qual caso un po' il buco largo non ha importanza.
Peter finito il

9

Se fate attenzione sui punti in fila ...

L'effetto di distorsione e trasformazione di Illustrator è perfetto per questo tipo di motivo ripetuto, ma per ottenere quel motivo esatto richiederà alcune modifiche. Inizia con una linea tratteggiata (con 11 punti per il tuo esempio)

Riquadro opzioni tratto Linea tratteggiata

Aggiungi un effetto Transform via Effect > Distort & Transform > Transform...

Opzioni di trasformazione dell'effetto file di punti radianti

Noterai che le righe interne hanno troppi punti. È qui che arriva la modifica manuale, ma questo dovrebbe portarti abbastanza lontano da capire il resto.


8

Usa Inkscape:

  1. Crea linee guida centriche e fai doppio clic sulle linee per ruotarle di uguale quantità (ho usato 30 gradi).
  2. Crea una serie di cerchi non centrati centrati impostando manualmente la larghezza e l'altezza e spostandoli al centro.
  3. Crea un cerchio pieno e copia incolla alcune volte.
  4. Utilizza lo strumento "Righe e colonne" per distribuirle lungo una riga, con spaziatura uguale
  5. Raggruppa i cerchi, quindi ruotali. Infine posizionali in modo che il centro sia allineato con l'intersezione della guida.
  6. Copia e incolla di nuovo.

inserisci qui la descrizione dell'immagine

E il risultato (usando 22,5 gradi per abbinare l'immagine dell'OP):

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.