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:
→
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.
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 ?
… Ma ci sono molti comandi nuovi (e anche vecchi in effetti ) che non conosco …
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.
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
@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…).
Ciao Lucio, grazie mille per la disponibilità…
Lo script funziona alla grande… L’unica rogna è la gestione dei blocchi
Sembra che gli oggetti siano nel nuovo livello, ma se si esplode il blocco in realtà gli oggetti tornano nel loro livello nativo
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.
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…
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?
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