以编程方式创建CAD文件

时间:2014-11-13 17:11:13

标签: c# 3d cad

我需要以编程方式创建CAD模型。含义:用户为模型设置参数,应用程序输出(在此处插入扩展名)文件以在SolidWorks / 3DStudio / Sketchup中使用。

应用程序生成具有变化半径的壳(例如管),我希望可视化外部生成的壳,通常在SolidWorks中。我想这就像this robot的输出。

我不完全确定我需要的输出,我需要测试一些选项。所以我正在寻找技术解决方案。一个好的输出文件将是一个具有恒定外部半径的管,但内部半径随Z(或相反)变化。

在SolidWorks中,我创建一个样条曲线并使用'Revolved Boss'将其拉伸到一个形状。然后创建另一个样条曲线并使用'旋转切割'来移除中心,如下图所示(红色 - 管道轮廓 - 外半径。绿色 - 内半径轮廓): Pipe

(这个例子在一个管子上,但形状(交叉点)并没有真正限制,但它们总是由几何形状组成)

所以,我的问题是:

  1. 是否有(免费的,如果可能的话)基础设施可以做到这一点?心爱的老板 和旋转切割?
  2. 此基础架构是否可以选择导出到CAD文件?
  3. 我认为我正在使用实体模型 - 是吗?
  4. 我应该创建一个点云(模拟许多交叉点并将它们连接在一起)?那我应该使用哪种文件格式?
  5. 主要用途是使用solidworks。我正在使用C#,但任何事情都有。

    我很抱歉这个模糊的问题 - 我在代码中使用CAD来崭新。

1 个答案:

答案 0 :(得分:3)

我最终使用了Eyeshot SDK。我试过的替代方案:

  • OpenSCAD - 很好,但我一直在寻找与代码集成的东西,而不是外部应用程序
  • OpenCASCADE - 它似乎可以做任何事情,但我花了太多时间来安装和配置。在我看来太乱了

Eyeshot有一个非常简单的SDK,可直接从C#使用。文档很糟糕,我花了太多时间试图找出它抛出的异常 - 但它有很好的代码示例。一旦你了解它就可以了。虽然有点贵。

我还在从事SolidWorks导出工作。 Eyeshot支持STL,IGEN,OBJ和STEP - Solidworks处理它们都没问题,但表面不平滑(圆圈不是圆形,只有很多多边形)。正如我所说 - 仍然在工作。

无论如何,对于将来的参考 - 以下是一些代码示例,它们创建类似的东西(外半径是常数,内半径变化)到我在问题中描述的内容(查看其中一个样本,如乐高,如何使用WorkUnit的):

public class CBuildOutput : WorkUnit
{
    EntityList entities = new EntityList();

    private void CreatePipe()
    {
        double outerRadius = 60;

        // First decide on accuracy
        double chordalError = 0.05;
        int slices = Utility.NumberOfSegments(outerRadius, chordalError);

        // Make a cylinder, the cut a hole from it

        // 1. Cylinder
        Solid cyl = Solid.CreateCylinder(outerRadius, 50, slices);

        // 2. Define the hole curve
        Curve innerCurve = new Curve(2, new List<Point3D>() {
            new Point3D(outerRadius - 20, 0, 0),
            new Point3D(outerRadius - 25, 0, 10),
            new Point3D(outerRadius - 15, 0, 20),
            new Point3D(outerRadius - 25, 0, 30),
            new Point3D(outerRadius - 15, 0, 40),
            new Point3D(outerRadius - 20, 0, 50)});

        // 3. Create an extrude-able sketch
        CompositeCurve holeSketch = new CompositeCurve(
            new Line(Point3D.Origin, new Point3D(40, 0, 0)),
            innerCurve,
            new Line(40, 0, 50, 0, 0, 50));

        // 4. Create a hole solid
        Solid hole = Solid.Revolve(holeSketch, chordalError, 0, 2 * Math.PI, Vector3D.AxisZ, Point3D.Origin, slices, true);

        // 5. Cut the hole from the cylinder    
        Solid[] final = Solid.Difference<Solid>(cyl, hole);

//          entities.Add(cyl, 0, Color.Red);
//          entities.Add(hole, 0, Color.Red);
        entities.Add(final[0], 0, Color.Red);
    }

    protected override void DoWork(System.ComponentModel.BackgroundWorker worker, System.ComponentModel.DoWorkEventArgs doWorkEventArgs)
    {
        CreatePipe();
    }

    protected override void WorkCompleted(ViewportLayout viewportLayout)
    {
        viewportLayout.Entities = entities;
        viewportLayout.ZoomFit();
//          viewportLayout.WriteIGES("model.iges", false);
    }
}