以编程方式创建CAD文件

3
我需要以编程方式创建CAD模型。意思是:用户设置模型参数,应用程序输出(插入扩展名)文件供SolidWorks/3DStudio/Sketchup使用。应用程序生成具有不同半径的外壳(例如管道),我想在外部可视化生成的外壳,通常在SolidWorks中进行。我想这就像这个机器人的输出一样。 我不完全确定所需的输出内容,我需要测试一些选项。因此,我正在寻找技术解决方案。一个好的起点是具有恒定外半径但内半径随Z变化(或反之亦然)的管道输出文件。 在SolidWorks中,我会创建样条曲线,并使用“旋转挤出”将其拉成形状。然后创建另一个样条曲线,使用“旋转切割”来移除中心,就像在这张图片中一样(红色-管道轮廓-外半径。绿色-内半径轮廓):Pipe (这个例子是关于管道的,但形状(交集)并没有真正限制,它们总是由几何形状组成的) 所以,我的问题是: 1.是否有(如果可能的话是免费的)基础设施可以完全做到这一点?旋转挤出和旋转切割? 2.该基础设施是否具有导出CAD文件的选项? 3.我认为我正在使用实体建模-是吗? 4.我应该只创建一个点云(模拟多个交集并将它们拼起来)吗?然后我应该使用哪种文件格式? 主要用途是与solidworks一起使用。我在使用C#,但任何语言都可以。 对于问题表述不够明确,我感到很抱歉-我对从代码中进行CAD建模还很陌生。

有表面模型,如STL、OBJ、SLP文件,还有实体模型,如STP、X_T、SAT。还有非常常见的标准IGS,介于实体和表面之间。首先确定您想要针对哪种格式(基于SolidWorks最喜欢的格式),然后查看是否有任何免费或商业库(.dll)可用于以编程方式处理这些文件。我最近根据http://home.global.co.za/~jhorn中发现的pascal代码编写了一个OBJ文件阅读器。 - John Alexiou
1
请查看此链接:http://www.devdept.com - abenci
我已经编辑了问题以使其更具体。感谢您的指引。 - Nitay
1个回答

4

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

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

Eyeshot有一个相当简单的SDK,可以直接从C#中使用。文档很糟糕,我花了太多时间试图弄清楚它抛出的异常 - 但它有很好的代码示例。一旦你了解它,就还好了。但稍微有点贵。

我仍在处理SolidWorks导出。Eyeshot支持STL、IGEN、OBJ和STEP格式 - Solidworks可以正常处理它们,但表面不光滑(圆不是圆形而是许多多边形)。就像我说的 - 还在努力中。

无论如何,以备将来参考 - 这里有一些代码示例,创建了与我在问题中描述的类似物品(外半径是恒定的,内半径在变化)(查看其中一个示例,比如Lego,了解如何使用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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接