EquationMgr 和 SelectionManger Solidworks 的问题 Api C#
Problems with EquationMgr & SelectionManger Solidworks Api C#
我想了解 solidworks 的原理 API,但有几个问题。
这是我的代码:
for (var i = 0; i < selMgr.GetSelectedObjectCount(); i++)
{
var Face = selMgr.GetSelectedObject(i+1);
surfaces.Add(Face.GetSurface());
measure = swModel.Extension.CreateMeasure();
if (surfaces[i].IsCylinder())
{
// Problem # 1
Console.WriteLine("Cylinder " + i);
measure.Calculate(surfaces[i]);
var diameter = measure.Diameter * 1000;
var length = 1000 * measure.Perimeter / (measure.Diameter * Math.PI);
var temp = swApp.OpenDoc6(@"E:\OAK\Locator9.SLDPRT", 1, 1, "", 0, 0);
var part = component.AddComponent5(@"E:\OAK\Locator9.SLDPRT", 0, "", true, "", 0, 0, 0.3);
swApp.CloseDoc(@"E:\OAK\Locator9.SLDPRT");
ModelDoc2 locator = part.GetModelDoc();
var eqMgr = locator.GetEquationMgr();
Console.WriteLine("Evaluated diameter " + diameter);
Console.WriteLine("Evaluated length " + length);
Console.WriteLine(eqMgr.Equation[1] + " " + eqMgr.Equation[2]);
//Problem #2
eqMgr.set_Equation(1, $@"""D""={diameter}");
eqMgr.set_Equation(2, $@"""L""={length}");
eqMgr.EvaluateAll();
locator.EditRebuild3();
locator.ForceRebuild3(false);
}
else
{
// TODO: Handle other type of surface
}
}
1) 我想测量所选表面的周长和直径。但是如果GetSelectedObjectCount()
方法的一个return值大于1,measure.Diameter & measure.Perimeter both returns -1
。而且我有点理解为什么,因为这样的操作也无法通过 UI 实现,但我可以做 smth 来解决问题吗?
2)上面的代码对插入元件的方程没有影响,即使是写在控制台上。
请帮忙!
1 对于原始表面,您可以使用 ISurface 对象的 *Params 属性 来获取您需要的信息。对于圆柱体,它将是 CylinderParams。我现在找不到 link,但我记得读过该度量不应用于任何精确计算,因为它不能保证始终准确。如果您不关心精度并且仍然想使用测量,您可以手动操作一组选定对象。
2 我没有使用过 IEquationMgr,但总的来说,我尽量避免使用 VB 风格的参数化属性,例如 Equation , I'd suggest trying to Delete and then Add 方程。
我想了解 solidworks 的原理 API,但有几个问题。 这是我的代码:
for (var i = 0; i < selMgr.GetSelectedObjectCount(); i++)
{
var Face = selMgr.GetSelectedObject(i+1);
surfaces.Add(Face.GetSurface());
measure = swModel.Extension.CreateMeasure();
if (surfaces[i].IsCylinder())
{
// Problem # 1
Console.WriteLine("Cylinder " + i);
measure.Calculate(surfaces[i]);
var diameter = measure.Diameter * 1000;
var length = 1000 * measure.Perimeter / (measure.Diameter * Math.PI);
var temp = swApp.OpenDoc6(@"E:\OAK\Locator9.SLDPRT", 1, 1, "", 0, 0);
var part = component.AddComponent5(@"E:\OAK\Locator9.SLDPRT", 0, "", true, "", 0, 0, 0.3);
swApp.CloseDoc(@"E:\OAK\Locator9.SLDPRT");
ModelDoc2 locator = part.GetModelDoc();
var eqMgr = locator.GetEquationMgr();
Console.WriteLine("Evaluated diameter " + diameter);
Console.WriteLine("Evaluated length " + length);
Console.WriteLine(eqMgr.Equation[1] + " " + eqMgr.Equation[2]);
//Problem #2
eqMgr.set_Equation(1, $@"""D""={diameter}");
eqMgr.set_Equation(2, $@"""L""={length}");
eqMgr.EvaluateAll();
locator.EditRebuild3();
locator.ForceRebuild3(false);
}
else
{
// TODO: Handle other type of surface
}
}
1) 我想测量所选表面的周长和直径。但是如果GetSelectedObjectCount()
方法的一个return值大于1,measure.Diameter & measure.Perimeter both returns -1
。而且我有点理解为什么,因为这样的操作也无法通过 UI 实现,但我可以做 smth 来解决问题吗?
2)上面的代码对插入元件的方程没有影响,即使是写在控制台上。
请帮忙!
1 对于原始表面,您可以使用 ISurface 对象的 *Params 属性 来获取您需要的信息。对于圆柱体,它将是 CylinderParams。我现在找不到 link,但我记得读过该度量不应用于任何精确计算,因为它不能保证始终准确。如果您不关心精度并且仍然想使用测量,您可以手动操作一组选定对象。
2 我没有使用过 IEquationMgr,但总的来说,我尽量避免使用 VB 风格的参数化属性,例如 Equation , I'd suggest trying to Delete and then Add 方程。