Сечение

Ниже мы рассмотрим, как работает функционал создания сечений и как им управлять. API C3D Web Viewer позволяет добавить в сцену два разных объекта сечения:

  • плоскости;

  • параллелепипед

Каждый из объектов можно создать и добавить в сцену с помощью следующей команды.

Пример SetSectionCommand (TypeScript):

export type SetSectionCommand = {
    name: "SetSectionCommand"
    params: C3DSectionParams
}

В этом типе свойство params позволяет указать секущий объект и его параметры.

Пример C3DSectionParams (TypeScript):

export type C3DSectionParams =
    | {
        name: "C3DSectionPlanes"
        planes: C3DSectionPlane[]
    }
    | {
        name: "C3DSectionOBB"
        box: C3DSectionOBB
        options?: {
            id?: number
        }
    }
    | {
        name: "C3DSectionAABB"
        box: C3DSectionAABB
        options?: {
            id?: number
        }
    }

Важно

При вызове команды все текущие объекты сечения, если таковые имеются, удаляются со сцены и заменяются новыми объектами, указанными через свойство params.

Примечание

На данный момент в сцену можно добавить либо плоскости сечения, либо один секущий параллелепипед.

Добавлено в версии 1.8.0: Добавлен функционал секущий параллелепипед.

Ниже мы рассмотрим каждый объект и примеры применения команды создания сечений более подробно.

Плоскость сечения

Этот объект сечения, как понятно из названия, позволяет добавить в сцену плоскость.

Примечание

На данный момент разрешено добавить только 6 плоскостей сечения.

Добавлено в версии 1.8.0: Увеличено количество плоскостей сечения одновременно в сцене с 4 до 6.

Вы можете добавить плоскость с помощью следующей команды.

Пример команды добавления плоскости сечения (TypeScript):

view.runCommand({
    name: "SetSectionCommand",
    params: {
        name: "C3DSectionPlanes",
        planes: [{
            placement: {
                a: 0,
                b: 1,
                c: 0
            },
            options: {
                direction: 'back'
            }
        }]
    }
})

Параметр planes определяет массив новых плоскостей сечения.

Каждая плоскость представляет собой экземпляр следующего типа:

type C3DSectionPlane = {
    placement: {
        a: number,
        b: number,
        c: number
    },
    options?: {
        id?: number
        direction?: "front" | "back"
    }
}

Параметр placement определяет плоскость сечения в 3D, и содержит:

  • a: угол (в радианах);

  • b: угол (в радианах);

  • c: смещение по оси X.

Также существует необязательный параметр options, который может содержать:

  • id: пользовательский идентификатор, используемый для идентификации плоскости сечения во внешней пользовательской системе;

  • direction: плоскость сечения делит модель на две части, и этот параметр определяет, какая из них отображается, другая скрыта (значение по умолчанию — «передняя часть»).

Интерактивное добавление

В дополнение к процессу плоскости сечения это позволяет в интерактивном режиме создать плоскость сечения по трем точкам модели.

После запуска процесса плоскость сечения передается обратному вызову onInitPlacement, где она добавляется в сцену.

Пример добавления плоскости сечения с помощью процесса плоскости (TypeScript):

view.runCommand({
    name: "RunProcessCommand",
    process: {
        name: "SetPlaneProcess",
        events: {
            onInitPlacement: (a: number, b: number, c: number) => {
                const plane = {
                    id: 1,
                    placement: {a, b, c},
                    name: 'Section plane 1'
                }

                view.runCommand({
                    name: "SetSectionCommand",
                    params: {
                        name: "C3DSectionPlanes",
                        planes: [plane]
                    }
                })
            }
        }
    }
})

Секущий параллелепипед

Этот объект сечения, как понятно из названия, позволяет добавить в сцену параллелепипед. Секущий параллелепипед представляет собой простой бокс, который покрывает часть любой геометрии внутри него и отсекает оставшуюся часть, оставшуюся снаружи.

Примечание

На данный момент разрешено добавить только один бокс.

Секущий параллелепипед может быть определен двумя типами. Первый из приведенных ниже определяет параметры рамки раздела на основе Oriented Bounding Box (OBB).

export type C3DSectionOBB = {
    position: C3DViewPoint
    rotation?: {
        aboutX?: number
        aboutY?: number
        aboutZ?: number
    }
    size: C3DViewBoxSize
}

Тип имеет следующие параметры:

  • position указывает нулевую точку бокса в глобальной системе координат;

  • rotation позволяет задать углы поворота вокруг главных осей бокса в радианах;

  • size определяет размер поля по основным осям (X – ширина, Y – глубина и Z – высота).

Второй тип ниже определяет параметры рамки сечения на основе Axis-aligned Bounding Box (AABB).

export type C3DSectionAABB = {
    min: C3DViewPoint
    max: C3DViewPoint
}

Тип имеет следующие параметры:

  • min указывает минимальную точку рамки в глобальной системе координат;

  • max указывает максимальную точку поля в глобальной системе координат.

Возможно, вы заметили, что тип C3DSectionParams, представленный выше, имеет дополнительную опцию для секущего бокса.

Получение из типа C3DSectionParams (TypeScript):

export type C3DSectionParams =
    | {...}
    // C3DSectionOBB
    | {
        ...,
        options?: {
            id?: number
        }
    }
    // C3DSectionAABB
    | {
        ...,
        options?: {
            id?: number
        }
    }

Объект options, имеющий следующее свойство:

  • id: настраиваемый идентификатор пользователя, используемый для идентификации секущего параллелепипеда во внешней пользовательской системе.

Пример команды для добавления секущего параллелепипеда (TypeScript):

view.runCommand({
    name: "SetSectionCommand",
    params: {
        name: "C3DSectionAABB",
        box: {
            min: {
                x: 0,
                y: 0,
                z: 0
            },
            max: {
                x: 10,
                y: 10,
                z: 10
            },
        }
    }
})