我正在尝试在名为Grasshopper(Rhino3D的一部分)的包中使用C#.net优化一些数学运算.操作非常简单,但必须执行的列表很大,可能会变得更大.
我在我的C#脚本中使用Parallel.ForEach和列表,我得到的最终结果数低于预期.这很可能是因为list.add不是线程安全的(或者我正在构建它的软件中没有线程安全).
private void RunScript(double z, int x, List<double> y, ref object A)
{
List<double> temp = new List<double>();
double r;
System.Threading.Tasks.Parallel.ForEach(y, numb =>
{
r = Math.Pow((numb * x), z);
temp.Add(r);
});
A = temp;
Run Code Online (Sandbox Code Playgroud)
请帮我找出一种使用CPU多线程在数百个值上运行这个简单数学运算的简单有效的方法(或者如果你有关于GPU CUDA的建议).
我希望这个模糊不清的软件不会打扰你,因为据我所知,它的表现与普通的C#.Net/Python/VB.Net完全相同.
我试图获得曲线的长度,但我收到的消息:MissingMemberException: 'Guid' object has no attribute 'length'
C#中的相同脚本完美无缺.python翻译有什么问题?这是文档.
蟒蛇:
import rhinoscriptsyntax as rs
ln = rs.AddLine(pt1, pt2)
a = ln
b = ln.Length
Run Code Online (Sandbox Code Playgroud)
C#:
Line ln;
ln = new Line(pt1, pt2);
A = ln;
B = ln.Length;
Run Code Online (Sandbox Code Playgroud) 我试图使用DivideByLength
基于RhinoCommon SDK的下面的方法,但我无法理解第三个参数是什么.我试图基于此方法编写下面的代码但我收到以下错误消息:Error: 'Rhino.Geometry.Point3d' is a 'type' but is used like a 'variable'
我认为第三个参数是指定我想要点作为输出而不是双倍.我究竟做错了什么?
方法:
Public Function DivideByLength ( _
segmentLength As Double, _
includeStart As Boolean, _
<OutAttribute> ByRef points As Point3d() _
) As Double()
Run Code Online (Sandbox Code Playgroud)
码:
List<Point3d> pts = new List<Point3d>();
for(int i = 0; i < crv.Count;i = i + 2)
{
pts.Add(crv[i].DivideByLength(nb, true, out Point3d()));
}
Run Code Online (Sandbox Code Playgroud) 任务
从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)
Run Code Online (Sandbox Code Playgroud)
笔记
我当时正在考虑使用python本机文件保存(open(“ layername.json”,“ a”)。这种想法是要以某种方式从每一层的对象中获取网格,将其转换为three.js json并改用它。但是我不知道如何从图层中获取网格,我已经导入了Rhino.Geometry以查看它是否有帮助。我不知道如何找到要转换的网格,或者我是否可以使用本机导出命令以一种自动化的方式,只使用obj文件。
以下说明来自Rhino Developer Docs
空
在VBScript中声明变量时,第一次赋值之前的变量值是未定义的,或者
Empty
.Run Code Online (Sandbox Code Playgroud)Dim varValue ' Empty value
所以基本上,
Empty
"我是一个未初始化的变体."如果您需要检测变量实际上是否为空变量而不是字符串或数字,您可以使用IsEmpty
.或者,您可以使用TypeName
或VarType
,但IsEmpty
最好.
因此Empty
用于声明变量.如果声明一个变量,则在堆栈中保留存储空间,但堆栈上的Empty值是多少?
rhino3d ×5
c# ×3
grasshopper ×2
python ×2
3d ×1
arguments ×1
atom-editor ×1
ironpython ×1
methods ×1
stack ×1
storage ×1
vbscript ×1