Сетка ClippingPlane (Eyeshot) не видна

введите описание изображения здесьЯ изо всех сил пытаюсь показать сетчатые плоскости при выполнении функции Edit() из ClippingPlane1 из моей модели. Он показывает только движущуюся опорную координату, заглушки, объекты и т. д., кроме плоскостей. При отладке оказывается, что clippingPlaneMesh (внутренняя структура) действительно вычислена, но с Visible = false. Я пытался использовать функцию ProcessClippingPlanesVisibility(gcnew cli::array‹ClippingPlane^›(1) { Model1-›ClippingPlane1 }, true), но безуспешно. Я также убедился, что ShowPlane верен.

Знаете ли вы, как показать плоскую сетку плоскости отсечения?

Спасибо

Абдулайе


person Abdoulaye ndiongue    schedule 24.12.2020    source источник
comment
Какой сущностью является ваш объект? Это сетка или твердое тело?   -  person Daniel Lord    schedule 29.12.2020
comment
Я использую Brep (в прошлом Solid3D)   -  person Abdoulaye ndiongue    schedule 30.12.2020


Ответы (1)


введите здесь описание изображения

Я создал минимально воспроизводимую модель плоскости отсечения. Из Пример объемного рендеринга DevDept. Я заметил две вещи: вам нужно убедиться, что область просмотра перерисовывается (viewport.Invalidate(); ) после вызова Edit(null). Также в примере Plane.Origin.Z запутался. Каким-то образом это не перерисовывается, пока не будет изменена вся плоскость clippingPlane1:

viewportLayout1.ClippingPlane1.Plane = new Plane(new Point3D(7, 7, 7), new Vector3D(0, 0, 1));

Код для ClippingPlane1:

private void addClippingPlane()
{
    // Remove Clipping Plane if Active
    if (viewportLayout1.ClippingPlane1.Active) { viewportLayout1.ClippingPlane1.Cancel(); }

    //sets the Z coordinate of the origin of the clippingPlane      
    viewportLayout1.ClippingPlane1.Plane = new Plane(new Point3D(7, 7, 7), new Vector3D(0, 0, 1));
            
    // enables a clippingPlane                           
    viewportLayout1.ClippingPlane1.Edit(null);          
            
    // refresh the viewport
    viewportLayout1.Invalidate();
}

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

Пример CutBy:

private void addCutByPlane()
{
    // Remove Clipping Plane if Active
    if (viewportLayout1.ClippingPlane1.Active) { viewportLayout1.ClippingPlane1.Cancel(); }

    //  Create Meshes
    Plane cutPlane1 = new Plane(new Point3D(7, 7, 7), new Vector3D(0, 0, 1));
    Mesh square = Mesh.CreateBox(15, 15, 15);

    // Cut Mesh by Plane
    square.CutBy(cutPlane1);

    // Length of Drawn part of plane
    double drawPlaneLength = 16;
    double hL = drawPlaneLength / 2;

            
    // Draw Plane region as a Quad Entity
    Point3D pO = cutPlane1.Origin;
    Point3D q1 = (pO + (cutPlane1.AxisX + cutPlane1.AxisY) * hL);
    Point3D q2 = (pO - (cutPlane1.AxisX - cutPlane1.AxisY) * hL);
    Point3D q3 = (pO - (cutPlane1.AxisX + cutPlane1.AxisY) * hL);
    Point3D q4 = (pO + (cutPlane1.AxisX - cutPlane1.AxisY) * hL);           

    Quad drawCutPlane1 = new Quad(q1, q2, q3, q4);
            
    viewportLayout1.Entities.Clear();
    viewportLayout1.Entities.Add(drawCutPlane1, Color.Red);
    viewportLayout1.Entities.Add(square, Color.Blue);

    viewportLayout1.Invalidate();
}

Полный пример:

using System;
using System.Drawing;
using System.Windows.Forms;
using devDept.Eyeshot.Entities;
using devDept.Geometry;

namespace EyeshotTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            makeSquare();
        }

        private void makeSquare()
        {
            Mesh square = Mesh.CreateBox(15, 15, 15);
            viewportLayout1.Entities.Add(square, Color.Green);
            viewportLayout1.Invalidate();           
        }

        private void addClippingPlane()
        {
            // Remove Clipping Plane if Active
            if (viewportLayout1.ClippingPlane1.Active) { viewportLayout1.ClippingPlane1.Cancel(); }

            //sets the Z coordinate of the origin of the clippingPlane      
            viewportLayout1.ClippingPlane1.Plane = new Plane(new Point3D(7, 7, 7), new Vector3D(0, 0, 1));
            
            // enables a clippingPlane                           
            viewportLayout1.ClippingPlane1.Edit(null);          
            
            // refresh the viewport
            //viewportLayout1.Entities.Regen(); 
            // ^ unneeded, but when in doubt always Regen & Invalidate
            // Then remove them where ever possible for speed improvments
            viewportLayout1.Invalidate();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            addClippingPlane();
        }

        private void addCutByPlane()
        {
            // Remove Clipping Plane if Active
            if (viewportLayout1.ClippingPlane1.Active) { viewportLayout1.ClippingPlane1.Cancel(); }

            //  Create Meshes
            Plane cutPlane1 = new Plane(new Point3D(7, 7, 7), new Vector3D(0, 0, 1));
            Mesh square = Mesh.CreateBox(15, 15, 15);

            // Cut Mesh by Plane
            square.CutBy(cutPlane1);

            // Length of Drawn part of plane
            double drawPlaneLength = 16;
            double hL = drawPlaneLength / 2;

            
            // Draw Plane region as a Quad Entity
            Point3D pO = cutPlane1.Origin;
            Point3D q1 = (pO + (cutPlane1.AxisX + cutPlane1.AxisY) * hL);
            Point3D q2 = (pO - (cutPlane1.AxisX - cutPlane1.AxisY) * hL);
            Point3D q3 = (pO - (cutPlane1.AxisX + cutPlane1.AxisY) * hL);
            Point3D q4 = (pO + (cutPlane1.AxisX - cutPlane1.AxisY) * hL);           

            Quad drawCutPlane1 = new Quad(q1, q2, q3, q4);
            
            viewportLayout1.Entities.Clear();
            viewportLayout1.Entities.Add(drawCutPlane1, Color.Red);
            viewportLayout1.Entities.Add(square, Color.Blue);

            viewportLayout1.Invalidate();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            addCutByPlane();
        }
    }
}

person Daniel Lord    schedule 28.12.2020
comment
Привет @Daniel, спасибо, что поделились. Я сделал именно так, как вы упомянули ранее, но без сетки четырехугольников (см. Мой скриншот в моем первом посте) :( - person Abdoulaye ndiongue; 29.12.2020
comment
@Abdoulayendiongue, что происходит, когда вы щелкаете и перетаскиваете опорную координату? Также попробуйте передать Edit(Color.Green). Вторая часть предназначена для вас, чтобы сделать свою собственную плоскость отсечения, если вы недовольны снимком. - person Daniel Lord; 29.12.2020
comment
Результаты все те же, если я перетащу или изменю цвет. Я постараюсь сделать свою собственную плоскость отсечения. Спасибо - person Abdoulaye ndiongue; 30.12.2020
comment
@Abdoulayendiongue, не могли бы вы проголосовать за этот ответ или принять его, если он вам помог? - person Daniel Lord; 02.03.2021