Программное создание файлов САПР

Мне нужно программно создать модель САПР. Значение: пользователь задает параметры модели, и приложение выводит файл (вставьте здесь расширение) для использования в SolidWorks / 3DStudio / Sketchup.

Приложение генерирует оболочки (например, трубу) с изменяющимися радиусами, и я хотел бы визуализировать оболочки, созданные извне, обычно в SolidWorks. Я предполагаю, что это что-то вроде вывода этого робота.

Я не совсем уверен в том, что мне нужно, мне нужно проверить несколько вариантов. Вот и ищу техническое решение. Хорошим выходным файлом для начала будет труба с постоянным внешним радиусом, но внутренний радиус меняется с Z (или наоборот).

В SolidWorks я бы создал сплайн и использовал «Revolved Boss», чтобы выдавить его в форму. Затем создайте еще один сплайн и используйте «Revolved Cut», чтобы удалить центр, как на этом рисунке (красный — контур трубы — внешний радиус. Зеленый — контур внутреннего радиуса): Труба

(Этот пример на трубе, но формы (пересечения) на самом деле не ограничены, хотя они всегда состоят из геометрических фигур)

Итак, мои вопросы:

  1. Существует ли инфраструктура (по возможности бесплатная) для этого? Revolved boss и Revolved Cut?
  2. Есть ли в этой инфраструктуре возможность экспорта в файлы САПР?
  3. Я думаю, что использую твердотельное моделирование - не так ли?
  4. Должен ли я просто создать облако точек (смоделировать множество пересечений и соединить их вместе)? Какой формат файла мне тогда использовать?

Основное использование будет для работы с SolidWorks. Я использую C#, но все идет.

Извините за расплывчатый вопрос - я новичок в САПР из кода.


person Nitay    schedule 13.11.2014    source источник
comment
Существуют поверхностные модели, такие как файлы STL, OBJ, SLP, а также твердотельные модели, такие как STP, X_T, SAT. Существует также очень распространенный стандарт IGS, который находится между твердыми телами и поверхностями. Сначала решите, какой формат вы хотите использовать (исходя из того, что больше нравится Solidworks), а затем посмотрите, существуют ли бесплатные или коммерческие библиотеки (.dll) для программной обработки этих файлов. Недавно я написал программу чтения файлов OBJ на основе кода Pascal, найденного в home.global.co.za/~jhorn. .   -  person John Alexiou    schedule 13.11.2014
comment
Проверьте это на devdept.com   -  person abenci    schedule 14.11.2014
comment
Я отредактировал вопрос, чтобы быть более конкретным. Спасибо за толчок в правильном направлении   -  person Nitay    schedule 14.11.2014


Ответы (1)


В итоге я использовал 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);
    }
}
person Nitay    schedule 16.11.2014