Esplosione blocchi annidati ricorsiva (python)

Dunque, ragazzi … puf puf … :wink:

Dopo parecchio ravanare, grazie alle spiegazioni di Lucio, forse abbiamo lo script che serve.

A me sembra piu’ utile (anche per eventuale uso personale) poter scegliere quali blocchi semplificare.
Quindi lo script consente di selezionare dei blocchi.
Se non si seleziona niente, lui semplifica tutti i blocchi, come richiesto da Andrea.
… Almeno dovrebbe …

import rhinoscriptsyntax as rs
# import scriptcontext
# import Rhino

def flatten( gid ):
  nam = rs.BlockInstanceName( gid )
  bobs = rs.BlockObjects( nam )
  nes = False
  for bob in bobs:
    if rs.IsBlockInstance( bob ):
      nes = True
      break
  if not nes:
    return False
  xfo = rs.BlockInstanceXform( gid )
  gids = rs.ExplodeBlockInstance( gid, True )
  xfi = rs.XformInverse( xfo )
  rs.TransformObjects( gids, xfi )
  rs.AddBlock( gids, [ 0.0, 0.0, 0.0 ], nam, True )
  rs.InsertBlock2( nam, xfo )
  return True

def main():
  blos = rs.GetObjects( 'Blocks to flatten [Enter => any block] ?', 
      filter = 4096, preselect = True )
  rs.UnselectAllObjects()
  if blos:
    nams = set( [] )
    for blo in blos:
      nam = rs.BlockInstanceName( blo )
      nams.add( nam )
  else:
    nams = rs.BlockNames()
  fnams = []
  rs.EnableRedraw( False )
  for nam in nams:
    gids = rs.BlockInstances( nam )
    if gids:
      if flatten( gids[ 0 ] ):
        fnams.append( nam )
  rs.EnableRedraw( True )
  wrd = 'definition' if len( fnams ) < 2 else 'definitions'
  txt = '%d %s flattened: ' % ( len( fnams ), wrd )
  for fnam in fnams:
    txt += ' %s,' % fnam
  print( txt[ : -1 ] )

main()

Non so se ho capito bene come funziona … pero’ sembra che funzioni … :confused:
Vedete voi … :wink:

3 Mi Piace