Eyeshot Devdept Solid на поверхность

Я использую версию 2020 Eyeshot.

Существует функция CutBy, которая разрезает сетку по поверхности, и она отлично работает.

Проблема получить поверхность. Например, из твердого тела или сетки, как создать поверхность.

Например, у меня есть тело, которое пересекает другое тело. Мне нужна разница, но метод Solid.Difference дает только одну часть вырезанного твердого тела. К сожалению, мне нужна другая часть.

Я могу получить пересечение с помощью метода Solid.Intersection. Я могу разрезать тело по поверхности пересечения, но не могу найти, как получить поверхность тела.

Вкратце, вопрос заключается в том, как получить объект поверхности или области из твердого тела для вызова метода Solid.Cutby(surface.Plane).

Вот что я сделал:

        var template = sceneLeft.Entities[0] as Mesh;
        var piece = sceneLeft.Entities[1] as Mesh;

        var solidT = template.ConvertToSolid();
        var solidP = piece.ConvertToSolid();

        var diff1 = Solid.Difference(solidT, solidP);
        var diff2 = Solid.Difference(solidP, solidT);

        var intersection = Solid.Intersection(solidT, solidP);

        diff1[0].Color = System.Drawing.Color.LightGray;
        diff2[0].Color = System.Drawing.Color.LightGray;

        diff1[0].ColorMethod = colorMethodType.byEntity;
        diff2[0].ColorMethod = colorMethodType.byEntity;

        diff1[0].EntityData = "base";
        diff2[0].EntityData = "piece";

        sceneLeft.Entities.Clear();

      

        //sceneLeft.Entities.Add(diff1[0]);
        //sceneLeft.Entities.Add(piece);

        sceneLeft.Entities.Add(diff2[0]); //diff2 is returns only one solid and not the part that I need.
        //sceneLeft.Entities.Add(intersection[0]);

        //diff2[0].Scale(1.02, 1.02, 1.02);

        //var diff3 = Solid.Difference(intersection[0], solidT);

        //sceneLeft.Entities.Add(diff3[0]);

        sceneLeft.Entities.Regen();
        sceneLeft.Invalidate();

Заранее спасибо.


person Coskun Ozogul    schedule 02.03.2021    source источник
comment
Я считаю, что diff представляет собой массив различий, поскольку разница может быть более чем одним сплошным телом. Я также считаю, что массив отсортирован по размеру, причем самая большая часть — diff[0], вторая по величине — diff[1]. Скоро   -  person Daniel Lord    schedule 02.03.2021
comment
Меня тоже смущает ваш вопрос. Поскольку вы не придали размерности своим двум сеткам, я представляю их как две сферы. Поверхность/область одной сферы — это часть сферы, также называемая полусферой. Плоскость можно провести по касательной к любой точке поверхности или через центр масс вашей сферы, и вы получите много разных вещей. Ваша режущая сетка имеет очень плоскую плоскую сторону, которую вы хотите разрезать?   -  person Daniel Lord    schedule 02.03.2021


Ответы (1)


Solid.Difference возвращает массив твердых тел из разницы двух

        public static bool materialSubtraction(ref Mesh targetMesh, Mesh tool)
        {
            bool success = false;
            Solid targetSolid = targetMesh.ConvertToSolid();
            Solid toolSolid = tool.ConvertToSolid();
            Solid[] differenceSolid = Solid.Difference(targetSolid, toolSolid);
            if(differenceSolid != null)
            {
                targetMesh = differenceSolid[0].ConvertToMesh();
                success = true;
            }           
            return success;
        }

Он удалит toolSolid из targetSolid. Это может привести к тому, что первое твердое тело будет состоять из нескольких частей, поэтому возврат будет Solid[]. Этот массив отсортирован по размеру, начиная с самого большого тела разницы. Если вам нужна другая деталь:

differenceSolid[x]

где х - нужная вам штука.

Чтобы создать плоскую поверхность для CutBy: самый простой способ сделать это — взять три вершины из твердого объекта и определить плоскость. чтобы получить это из твердого тела, это:

Point3D X1 = toolSolid.Portions[0].Vertices[1];

Меши не имеют частей и имеют здесь вершины:

Point3D X1 = targetMesh.Vertices[1];
        public static bool materialCutBy(ref Mesh targetMesh, Mesh tool)
        {           
            Solid toolSolid = tool.ConvertToSolid();

            Point3D X1 = targetMesh.Vertices[1];
            Point3D X2 = targetMesh.Vertices[2];
            Point3D X3 = targetMesh.Vertices[3];

            Plane P1 = new Plane(X1, X2, X3);

            var success = toolSolid.CutBy(P1);

            if(success == booleanFailureType.Success)
            {
                targetMesh = toolSolid.ConvertToMesh();
                return true;
            }
            else { return false; }          
        }
person Daniel Lord    schedule 02.03.2021
comment
Спасибо за этот очень полезный ответ! Это не совсем то, что мне нужно, но очень полезно. - person Coskun Ozogul; 04.03.2021