[英]How to interact with open Rhino3D application using Python script
[英]Export layers as obj from Rhino3d
任務
從Rhino將圖層導出為obj文件。
問題
使用Python腳本時,我運行導出命令。 在界面中會顯示一個對話框,而不是導出模型。 如果我單擊導出界面,則可以正常工作。 但是,它會彈出每個圖層的對話框。 我有很多層,但我想使整個導出過程自動化。
最終目標是通過three.js在webGL中顯示obj文件。
我是Python和Rhino的新手,但是了解PHP和JavaScript,所以我對這些概念已經足夠了解,並且已經看過一些關於Python的教程,因此我可以開始使用此腳本。
我嘗試過的
我正在使用Rhino,Atom / Python。
import scriptcontext
import rhinoscriptsyntax as rs
from Rhino.Geometry import Point3d
def layerNames(sort=False):
rc = []
for layer in scriptcontext.doc.Layers:
if not layer.IsDeleted: rc.append(layer.FullPath)
if sort: rc.sort()
return rc
rs.EnableRedraw(False)
strPath = rs.DocumentPath()
strName = rs.DocumentName()
arrLayers = layerNames(False)
for layerName in arrLayers:
objs = scriptcontext.doc.Objects.FindByLayer(layerName)
rs.Command("_-Export "+layerName+".obj", False)
筆記
我當時正在考慮使用python本機文件保存(open(“ layername.json”,“ a”)。這種想法是要以某種方式從每一層的對象中獲取網格,將其轉換為three.js json並改用它。但是我不知道如何從圖層中獲取網格,我已經導入Rhino.Geometry以查看它是否有用,我不知道如何找到要轉換的網格,或者我是否可以使用本機導出命令以一種自動化的方式,只使用obj文件。
這是導出dae,obj和stl的最終腳本。 適當的設置是相當激進的多邊形縮小。 調整角度和密度以改變它。
我發現需要將密度設置為零,然后再將其設置為另一個值,從而解決了網格轉換中的多邊形計數問題。
import os
import scriptcontext
import rhinoscriptsyntax as rs
print "//export run started/////////////"
# this function via mcneel/rhinoscriptsyntax
#https://github.com/mcneel/rhinoscriptsyntax/blob/master/Scripts/rhinoscript/layer.py
def layerNames(sort=False):
rc = []
for layer in scriptcontext.doc.Layers:
if not layer.IsDeleted: rc.append(layer.FullPath)
if sort: rc.sort()
return rc
def GetDAESettings():
e_str = ""
return e_str
def GetOBJSettings():
e_str = "_Geometry=_Mesh "
e_str+= "_EndOfLine=CRLF "
e_str+= "_ExportRhinoObjectNames=_ExportObjectsAsOBJGroups "
e_str+= "_ExportMeshTextureCoordinates=_Yes "
e_str+= "_ExportMeshVertexNormals=_No "
e_str+= "_CreateNGons=_No "
e_str+= "_ExportMaterialDefinitions=_No "
e_str+= "_YUp=_No "
e_str+= "_WrapLongLines=Yes "
e_str+= "_VertexWelding=_Welded "
e_str+= "_WritePrecision=4 "
e_str+= "_Enter "
e_str+= "_DetailedOptions "
e_str+= "_JaggedSeams=_No "
e_str+= "_PackTextures=_No "
e_str+= "_Refine=_Yes "
e_str+= "_SimplePlane=_No "
e_str+= "_AdvancedOptions "
e_str+= "_Angle=50 "
e_str+= "_AspectRatio=0 "
e_str+= "_Distance=0.0"
e_str+= "_Density=0 "
e_str+= "_Density=0.45 "
e_str+= "_Grid=0 "
e_str+= "_MaxEdgeLength=0 "
e_str+= "_MinEdgeLength=0.0001 "
e_str+= "_Enter _Enter"
return e_str
def GetSTLSettings():
eStr = "_ExportFileAs=_Binary "
eStr+= "_ExportUnfinishedObjects=_Yes "
eStr+= "_UseSimpleDialog=_No "
eStr+= "_UseSimpleParameters=_No "
eStr+= "_Enter _DetailedOptions "
eStr+= "_JaggedSeams=_No "
eStr+= "_PackTextures=_No "
eStr+= "_Refine=_Yes "
eStr+= "_SimplePlane=_No "
eStr+= "_AdvancedOptions "
eStr+= "_Angle=15 "
eStr+= "_AspectRatio=0 "
eStr+= "_Distance=0.01 "
eStr+= "_Grid=16 "
eStr+= "_MaxEdgeLength=0 "
eStr+= "_MinEdgeLength=0.0001 "
eStr+= "_Enter _Enter"
return eStr
settingsList = {
'GetDAESettings': GetDAESettings,
'GetOBJSettings': GetOBJSettings,
'GetSTLSettings': GetSTLSettings
}
fileName = rs.DocumentName()
filePath = rs.DocumentPath().rstrip(fileName)
arrLayers = layerNames(False)
def initExportByLayer(fileType="obj", visibleonly=False, byObject=False):
for layerName in arrLayers:
layer = scriptcontext.doc.Layers.FindByFullPath(layerName, True)
if layer >= 0:
layer = scriptcontext.doc.Layers[layer]
save = True;
if visibleonly:
if not layer.IsVisible:
save = False
if rs.IsLayerEmpty(layerName):
save = False
if save:
cutName = layerName.split("::")
cutName = cutName[len(cutName)-1]
objs = scriptcontext.doc.Objects.FindByLayer(cutName)
if len(objs) > 0:
if byObject:
i=0
for obj in objs:
i= i+1
saveObjectsToFile(cutName+"_"+str(i), [obj], fileType)
else:
saveObjectsToFile(cutName, objs, fileType)
def saveObjectsToFile(name, objs, fileType):
rs.EnableRedraw(False)
if len(objs) > 0:
settings = settingsList["Get"+fileType.upper()+"Settings"]()
rs.UnselectAllObjects()
for obj in objs:
obj.Select(True)
name = "".join(name.split(" "))
command = '-_Export "{}{}{}" {}'.format(filePath, name, "."+fileType.lower(), settings)
rs.Command(command, True)
rs.EnableRedraw(True)
initExportByLayer("obj",True, False)
initExportByLayer("dae",True, False)
initExportByLayer("stl",True, False)
print "//export run ended/////////////"
事實證明這很簡單。 您需要提供完整的文件路徑,名稱和擴展名。 對話框可以使用多個_Enter命令自動執行。 在此腳本中,使用默認的obj選項。 可以將選項附加到_-Export命令之后,然后再調用它們各自的_Enter命令。
import scriptcontext
import rhinoscriptsyntax as rs
def layerNames(sort=False):
rc = []
for layer in scriptcontext.doc.Layers:
if not layer.IsDeleted: rc.append(layer.FullPath)
if sort: rc.sort()
return rc
fileName = rs.DocumentName()
filePath = rs.DocumentPath().rstrip(fileName)
extension = ".obj"
arrLayers = layerNames(False)
for layerName in arrLayers:
objs = scriptcontext.doc.Objects.FindByLayer(layerName)
if len(objs) > 0:
rs.UnselectAllObjects()
for obj in objs:
obj.Select(True)
scriptcontext.doc.Views.Redraw()
rs.Command("_-Export "+filePath+layerName+extension+" _Enter _Enter")
在我的筆記中,我提到了利用Mesh對象並通過Python編寫自己的文件。 這仍然是一個可行的選擇,但是該方法尚未在Mac for Rhino上實現。 我現在要使用遞歸函數來查找嵌套層。 完成后,我會將解決方案發布到Gist。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.