Script Python - Suddivisione in parti uguali

Buongiorno,
sono ad un primo tentativo nello scrivere uno script in python e ho trovato una difficoltà.
Ho una serie di piastre a larghezza variabile, da forare lungo la direzione y ad interasse costante di circa 400 mm che può variare, a seconda della larghezza della piastra, tra 350 e 500 mm.
Ho posizionato con le stringhe seguenti i due cerchi che mi indicano la partenza (fissa) dei due fori

lun=abs(lunghezza)
lar=abs(larghezza)

f1=[50,200,0]
f2=[50,lar-200,0]

foro1=rs.AddCircle(f1, 5)
foro2=rs.AddCircle(f2, 5)

c’è un modo per creare una regola che mi suddivida in spazi uguali (tra 350 e 500 mm) la distanza tra f1 ed f2 e mi posizioni in tali punti dei cerchi a raggio 5 mm?

Grazie a chi risponderà.

Buondi’

Ho provato a cercare passo tra i fori e numero di fori,
in funzione della larghezza della piastra.

Bel problema !
Almeno, per me non e’ semplicissimo.

Se vuoi provare, lo script qui sotto ti chiede delle larghezze e ricava ( … in qualche modo)
numero di punti e passo.

Non so se sia una buona soluzione.
Se vuoi provare …

import rhinoscriptsyntax as rs
import math

def main():
  while True:
    lar = rs.GetReal( 'Larghezza ?' )
    if not lar:
      break
    dy = lar - 400
    nmin = math.ceil( dy / 500 )
    nmax = math.floor( dy / 350 )
    print( 'Numero minimo di passi: %d' % nmin )
    print( 'Numero massimo di passi: %d' % nmax )
    if nmin > nmax:
      print( 'Impossibile trovare un passo con larghezza %g' % lar )
      continue
    if nmin == nmax:
      np = nmin
    else:
      n400 = round( dy / 400 )
      if ( n400 >= nmin ) and ( n400 <= nmax ):
        np = n400
      else:
        dmin = abs( n400 - nmin )
        dmax = abs( n400 - nmax )
        if dmin < dmax:
          np = nmin
        else:
          np = nmax
    pa = dy / np
    print( 'Larghezza %g:' % lar )
    print( 'Passo %g' % pa )
    print( 'Numero fori %d' % ( np + 1 ) )

main()

Adesso devo andare, scusa …

Saluti

Grazie mille!
L’ho riadattato un attimo ed era proprio quello che mi serviva.
Se posso chiedere un altro parere sto avendo difficoltà nel far andare automaticamente un linear array (comando rhino).
Da una verifica mi risulta che il problema sta nell’inserimento delle coordinate di punto base e punto di riferimento distanza che restano racchiuse tra parentesi, di conseguenza Rhino non riesce a leggerle.
Qualche suggerimento in merito?

Allego parte di script incriminata.

dy =lar-200-200 #distanza tra i primi due occhielli escluse partenze
nmin = math.ceil(dy/500) #numero minimo occhielli usando larghezza max passo
nmax = math.floor(dy/350) #numero massimo occhielli usando larghezza min passo
if nmin>nmax:
print( ‘Impossibile trovare un passo con larghezza %g’ % lar ) #se nmin maggiore di nmax compare avviso

if nmin==nmax: #se num min = num max 
  np=nmin #num passi tra occhielli = num min occhielli
else:
  n400=round(dy/400) #calcolo arrotondato di dy / passo richiesto = num passo di calcolo
  if(n400>=nmin)and(n400<=nmax): #se num passo di calcolo >= num min o <= num max
    np=n400 #allora num passi = passo di calcolo
  else:
    dmin=abs(n400-nmin)
    dmax=abs(n400-nmax)
    if dmin<dmax:
      np=nmin
    else:
      np=nmax

# casistica necessaria al calcolo del numero di passi tra i fori

pa=dy/np #calcolo del passo dei fori

nf=np+1 #numero fori = numero passi + 1

c1=[pie+20,200+sald,0]
c2=[pie+alt+lun+alt-20,200+sald,0]
r=6 #raggio cerchio
#partenze occhielli

foro1=rs.AddCircle(c1, r)
foro2=rs.AddCircle(c2, r)
rs.ObjectLayer([occhiello1,occhiello2], layer="4")
#disegna foro partenza

c3=[pie+20,200+sald+pa,0] #secondo punto riferimento per array linear    

rs.SelectObject(foro1)
rs.SelectObject(foro2)
rs.Command("_ArrayLinear "+str(nf)+" " +str(c1)+" " +str(c3))

Grazie, Alberto

Ciao Alberto

Prova con

str( rs.coerce3dpoint( c1 ) )

Dovrebbe scrivere le coordinate del punto in formato comandi-Rhino.

Provo ad abbozzare una spiegazione di cosa succede (per quanto ne so … ) :

rhinoscriptsyntax e’ un modulo Python che usufruisce a sua volta di RhinoCommon :
https://developer.rhino3d.com/api/RhinoCommon/html/N_Rhino.htm
… Che e’ la libreria di classi che permette la comunicazione con Rhino, e contiene anche tutte le classi che definiscono gli oggetti geometrici.
Tra queste c’e’ Rhino.Geometry.Point3d , che rappresenta i normali punti dello spazio 3D.

rs.coerce3dpoint() serve appunto ad ottenere un Point3d da altre rappresentazioni, ad esempio la lista con 3 numeri.

La conversione in stringa di un oggetto Point3d fornisce proprio il formato richiesto dai comandi Rhino.

1 Mi Piace

Funziona tutto alla perfezione.
Grazie mille delle dritte e della spiegazione.
Effettivamente ha la sua logica.

Prego, figurati ! :slight_smile: