Importare con nome livello come nome file

Buongiorno a tutti, mi capita spesso di importare più file (step o iges) da fornitori esterni, e mi piacerebbe avere la possibilità di creare un livello per ogni file che importo, che abbia il nome del file stesso e come sottolivelli i contenuti di quel file.

esempio:

immagineimmagine

Purtroppo io non sono molto esperto di script, quindi vi chiederei gentilmente aiuto.
Grazie e tutti

Temo che serva proprio essere molto esperti di script. :wink:
O almeno esperti di script per i livelli.

Nei limiti del poco che so io non trovo niente di semplice per fare questa operazione, soprattutto se non vuoi perdere informazioni.

Salvo ovviamente importare in un file nuovo, annidare i livelli a mano e poi importare questo file nel file ‘principale’.
E anche questo non mi sembra facile da automatizzare …
Che comando uso per annidare un livello ?
:confused: :confused: :confused:

… Ma ci sono molti comandi nuovi (e anche vecchi in effetti :blush: :smile:) che non conosco …
:slight_smile:

:+1:

Io ho fatto uno script simile per importare i DWG e i DXF ma senza modificare i livelli.
Raggruppa tutto quello è stato appena importato e gli assegna il nome del file di partenza così da non “rompere” la struttura dei layer.
Poi, anche esplodendo il gruppo, ogni oggetto mantiene comunque il nome uguale al file di origine.

Cioè cambia/assegna il nome di ogni oggetto, con il nome del file?
Non è molto diverso da quello che mi servirebbe

Ho provato ad adattarlo per file STP
Praticamente ti chiede di selezionare la cartella dove ci sono i file .stp da importare e poi fa tutta la procedura.

Option Explicit
  
Sub BatchImportSTP()
  
	' Allow the user to interactively pick a folder
	Dim sFolder
	sFolder = Rhino.WorkingFolder
	sFolder = Rhino.BrowseForFolder(sFolder, "Select folder to process", "Batch Import STP")
	If VarType(sFolder) <> vbString Then 
		Exit Sub
	End If
	
	' Create a file system object
	Dim oFSO
	Set oFSO = CreateObject("Scripting.FileSystemObject") 
  
	' Get a folder object based on the selected folder
	Dim oFolder
	Set oFolder = oFSO.GetFolder(sFolder)
    
	' Process the folder
	ProcessFolder oFSO, oFolder
  
	' Release the objects
	Set oFolder = Nothing
	Set oFSO = Nothing
  
End Sub
  
Sub ProcessFolder(oFSO, oFolder)

	Dim oFile, strOpen, arrObjects, strFile

	Rhino.EnableRedraw(False)

	' Import all stp files in the selected folder
	For Each oFile In oFolder.Files
		If LCase(oFSO.GetExtensionName(oFile.Path)) = "stp" Then
		
			strOpen = LCase(oFile.Path)
			strFile = oFSO.GetFileName(oFile.Path)

			Rhino.Command "_NoEcho _-Import " & chr(34) & strOpen & chr(34) & " _Enter"
			Rhino.AddGroup strFile
			arrObjects = Rhino.SelectedObjects
			If Not Isnull(arrObjects) Then
				Rhino.UnselectAllObjects
				Rhino.ObjectName arrObjects, strFile
				Rhino.AddObjectsToGroup arrObjects, strFile
			End If			
		End If
	Next
	Rhino.EnableRedraw(True)
End Sub

BatchImportSTP

Vedi se ti può essere utile.

2 Mi Piace

Ciao, per il momento mi può dare una mano…
Grazie @lucio_zadra

Mi è venuta un’idea su come si potrebbe fare per spostare nei layer e sublayer ma prima di sparare cavolate verifico se funziona…

2 Mi Piace

Sto facendo prove anche io e speravo bastasse rinominare il livello tipo “Volante::Clacson” ma non funziona…
Sarebbe stato troppo facile :frowning:

@depaoli.thomas
Non so se ho fatto tutto corretto… sono un pò incasinato con il lavoro…
Comunque, facendo una prova veloce, sembra funzionare (ho importato un pò di step che avevo su una cartella ma erano dei file pieni di roba quindi non vorrei ci fossero degli errori che mi sono sfuggiti).

Option Explicit
'Script written by Lucio Zadra'
'Script copyrighted by Zadra Giuseppe'
'Script version venerdì 24 maggio 2024 19:46:16'
 
Sub BatchImportSTP()
  
	' Allow the user to interactively pick a folder'
	Dim sFolder
	sFolder = Rhino.WorkingFolder
	sFolder = Rhino.BrowseForFolder(sFolder, "Select folder to process", "Batch Import STP")
	If VarType(sFolder) <> vbString Then 
		Exit Sub
	End If
	
	' Create a file system object'
	Dim oFSO
	Set oFSO = CreateObject("Scripting.FileSystemObject") 
  
	' Get a folder object based on the selected folder'
	Dim oFolder
	Set oFolder = oFSO.GetFolder(sFolder)
    
	' Process the folder'
	ProcessFolder oFSO, oFolder
  
	' Release the objects'
	Set oFolder = Nothing
	Set oFSO = Nothing
  
End Sub
  
Sub ProcessFolder(oFSO, oFolder)

	Dim oFile, strOpen, arrObjects, strFile, Obj, SubLay

	Rhino.EnableRedraw(False)

	' Import all stp files in the selected folder'
	For Each oFile In oFolder.Files
		If LCase(oFSO.GetExtensionName(oFile.Path)) = "stp" Then
		
			strOpen = LCase(oFile.Path)
			strFile = oFSO.GetFileName(oFile.Path)

			Rhino.Command "_NoEcho _-Import " & chr(34) & strOpen & chr(34) & " _Enter"
			Rhino.Addlayer strFile
			arrObjects = Rhino.SelectedObjects
			If Not Isnull(arrObjects) Then
				Rhino.UnselectAllObjects
				For Each Obj In arrObjects
					Sublay = Rhino.ObjectLayer(Obj)
					Rhino.AddLayer strFile & "::" & Sublay
					Rhino.ObjectLayer Obj, strFile & "::" & Sublay					
				Next
			End If			
		End If
	Next
	Rhino.EnableRedraw(True)
End Sub

BatchImportSTP

Una cosa che ho evitato di fare è stata quella di eliminare layer teoricamente rimasti vuoti dopo che gli oggetti sono stati spostati nel nuovo layer-sottolayer.
Ti fai un purge a fine importazione così togli quello che effettivamente vuoi eliminare (si può automatizzare ma non vorrei cancellarti qualcosa che invece ti serve…).

1 Mi Piace

Ciao Lucio, grazie mille per la disponibilità…
Lo script funziona alla grande… L’unica rogna è la gestione dei blocchi :poop: :poop:
Sembra che gli oggetti siano nel nuovo livello, ma se si esplode il blocco in realtà gli oggetti tornano nel loro livello nativo :sob:

I blocchi sono una cosa a parte.
L’istanza del blocco risiede nel layer ma la definizione del blocco risiede in uno spazio a parte.
Dovresti esplodere il blocco prima dell’importazione.
Altrimenti bisognerebbe fare uno script che agisce sulle istanze blocco:

  • Selezioni l’istanza del blocco
  • Si verifica a che layer appartiene
  • Si esplode l’istanza e, per ogni oggetto, si crea un sottolayer (come padre si mantiene il layer iniziale dell’istanza)
  • Si sposta ogni oggetto all’interno del sottolayer.

Diciamo che è più sicuro lavorare a compartimenti perchè automatizzare certe operazioni potrebbero incasinare progetti su cui si ha lavorato per settimane.

1 Mi Piace

robetta da poco in pratica :grin: :laughing:

:+1:

Diciamo che la gestione dei blocchi in rhino non è per niente intuitiva…

Per quel poco che capisco, mi sembra che il tuo script, importa i file, poi crea dei sublayer con lo stesso nome di quelli importati , e ci sposta dentro gli oggetti. Sbaglio?
Il problema dei blocchi si potrebbe bypassare, spostando i layer creati in importazione, sotto un layer nuovo. Manualmente funziona, ma non so se si possa fare da script.

Si, si può fare, metto a posto uno script che fa quello specificato nell’elenco che ho postato più su.
Faccio anche uno script che importa un singolo file invece che tutta la cartella (dato che accadrà prima o dopo che devi importare una sola cosa).
Tecnicamente saranno tre script separati:

  • quello che importa tutti i file in una cartella e sposta gli oggetti nei relativi sottolivelli
  • quello che importa un singolo file e sposta gli oggetti nei relativi sottolivelli
  • quello che esplode un’istanza blocco (si potrebbe fare anche più istanze) spostando tutti gli oggetti in sottolivelli rispetto al livello dove risiede l’istanza originale

Ovviamente prima devo finre i miei lavori urgenti e poi mi metto a fare script altrimenti a fine giornata ho i clienti che mi aspettano fuori dal cancello…

Vai tranquillo… stai già facendo anche troppo…

Questo lo script per esplodere l’istanza del blocco mettendo tutti gli oggetti nei sottolayer corrispondenti.
Ovviamente, se i sublayer esistono già, gli oggetti vengono messi all’interno senza generare dei doppioni (gli oggetti estratti dal blocco andranno assieme ad eventuali oggetti presenti nel sublayer).
Se vuoi, si possono raggruppare gli oggetti del blocco in modo da mantenere le loro posizioni relative.

Option Explicit
'Script written by Lucio Zadra '
'Script copyrighted by Zadra Giuseppe '
'Script version lunedì 27 maggio 2024 18:53:25 '

Call BlockExpl()
Sub BlockExpl()
	
	Dim BlockIst, Obj, ObjsArray, InstLayer, ObjLayer, LayerColor
	
	BlockIst = Rhino.GetObject("Select block instance to explode", 4096, VBTrue)
	
	If Rhino.IsBlockInstance(BlockIst) Then
	
		InstLayer = Rhino.ObjectLayer(BlockIst)
	
		ObjsArray = Rhino.ExplodeBlockInstance(BlockIst)
	
		If Not IsNull(ObjsArray) Then
			
			For Each Obj In ObjsArray
				
				ObjLayer = Rhino.ObjectLayer(Obj)
				
				LayerColor = Rhino.LayerColor(ObjLayer)
			
				Rhino.AddLayer InstLayer & "::" & ObjLayer, LayerColor
			
				Rhino.ObjectLayer Obj, InstLayer & "::" & ObjLayer	
				
			Next
			
			
		End If
		
	End If
	
End Sub

eeee non so con quale versione di Rhino hai iniziato, ma con le ultime è migliorato molto su questo aspetto, qualche cosina la farei modificherei anch’io solo che per queste cose bisognerebbe essere in più persone a chiederlo e con argomenti ben motivati
se si vuole che venga presa seriamente una richiesta.

tu cosa cambieresti o aggiungeresti e per quale scopo?

1 Mi Piace

Io svincolerei completamente la definizione del blocco dal resto del modello di rhino come se il blocco fosse linkato da un file esterno.
Si perderebbe la possibilità di modificare le proprietà dell’oggetto (che appartiene al blocco) agendo sulle impostazioni del layer ma gioverebbe alla comprensione di cosa è un blocco e dove si trova.
Un pò quello che farei nei layout, gli oggetti vengono aggiunti nei detail ma con un comportamento statico, come se li avessi copiati e incollati nel layout (anche spostando o aggiungendo oggetti nel modello il detail rimane focalizzato sull’oggetto iniziale facendo vedere solo quello).
Ma prima di aggiungere wish devo verificare che nella V8 non sia già stato messo quello che chiedo… purtroppo lavoro ancora più con la v7 che la v8