Skip to content

Commit

Permalink
ISSUE #4642 - Moved ticket transformation logic to viewpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
sanmont3drepo committed Jan 18, 2024
1 parent cff7df7 commit 7b7c1fd
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 53 deletions.
3 changes: 0 additions & 3 deletions frontend/src/v4/modules/sequences/sequences.sagas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
import { all, put, select, take, takeLatest } from 'redux-saga/effects';
import { DialogsActionsDispatchers } from '@/v5/services/actionsDispatchers';

import { TicketsCardActions } from '@/v5/store/tickets/card/ticketsCard.redux';
import { VIEWER_PANELS } from '../../constants/viewerGui';

import * as API from '../../services/api';
Expand Down Expand Up @@ -239,8 +238,6 @@ export function* restoreModelDefaultVisibility() {
}

export function* setSelectedSequence({ sequenceId }) {
yield put(TicketsCardActions.setTransformations({}));

if (sequenceId) {
yield put(SequencesActions.initializeSequences());
yield put(SequencesActions.fetchSequence(sequenceId));
Expand Down
8 changes: 4 additions & 4 deletions frontend/src/v4/modules/viewerGui/viewerGui.selectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
*/

import { createSelector } from 'reselect';
import { selectTicketOverrides, selectTicketTransformations, selectTicketTransparencies } from '@/v5/store/tickets/card/ticketsCard.selectors';
import { selectTicketOverrides, selectTicketTransparencies } from '@/v5/store/tickets/card/ticketsCard.selectors';
import { VIEWER_PANELS } from '../../constants/viewerGui';
import * as Bim from '../bim';
import { selectOverrides as selectGroupsOverrides,
Expand Down Expand Up @@ -103,9 +103,9 @@ export const selectAllTransparencyOverrides = createSelector(
);

export const selectTransformations = createSelector(
selectViewsTransformations, selectSelectedFrameTransformations, selectTicketTransformations,
(viewsTransformations, sequenceTransformations, ticketsTransformations) =>
({...sequenceTransformations, ...viewsTransformations, ...ticketsTransformations})
selectViewsTransformations, selectSelectedFrameTransformations,
(viewsTransformations, sequenceTransformations) =>
({...sequenceTransformations, ...viewsTransformations})
);

export const selectDisabledPanelButtons = createSelector(
Expand Down
101 changes: 71 additions & 30 deletions frontend/src/v5/helpers/viewpoint.helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,18 @@
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import { Viewpoint, Group, ViewpointGroupOverrideType, GroupOverride, ViewpointState, V4GroupObjects, OverridesDicts, MeshIdTransformDict } from '@/v5/store/tickets/tickets.types';
import { Viewpoint, Group, ViewpointGroupOverrideType, GroupOverride, ViewpointState, V4GroupObjects, OverridesDicts } from '@/v5/store/tickets/tickets.types';
import { getGroupHexColor, rgbaToHex } from '@/v4/helpers/colors';
import { generateViewpoint as generateViewpointV4, getNodesIdsFromSharedIds, toSharedIds } from '@/v4/helpers/viewpoints';
import { formatMessage } from '@/v5/services/intl';
import { dispatch, getState } from '@/v4/modules/store';
import { isEmpty } from 'lodash';
import { Viewer as ViewerService } from '@/v4/services/viewer/viewer';
import { isEmpty, isString } from 'lodash';
import { TreeActions } from '@/v4/modules/tree';
import { ViewerGuiActions } from '@/v4/modules/viewerGui';
import { selectCurrentTeamspace } from '../store/teamspaces/teamspaces.selectors';
import { TicketsCardActionsDispatchers } from '../services/actionsDispatchers';
import { ViewpointsActions } from '@/v4/modules/viewpoints';
import { GroupsActions } from '@/v4/modules/groups';
import { SequencesActions } from '@/v4/modules/sequences';

export const convertToV5GroupNodes = (objects) => objects.map((object) => ({
container: object.model as string,
Expand Down Expand Up @@ -106,6 +107,63 @@ export const getViewerState = async () => {
return state;
};

const convertToV4Group = (groupOverride: GroupOverride) => {
const { color, opacity, transformation, group: v5Group } = groupOverride;

if (isString(v5Group)) {
return { color: [0, 0, 0, 0], objects: [] }; // theres no info yet so I say us an empty group
}

const group:any = {
objects: convertToV4GroupNodes(v5Group?.objects || []),
};

if (color) {
group.color = getGroupHexColor([...color, Math.round((opacity ?? 1) * 255)]);
}

if (opacity) {
group.opacity = opacity;
}

if (transformation) {
group.transformation = transformation;
}

return group;
};

export const viewpointV5ToV4 = (viewpoint: Viewpoint) => {
let v4Viewpoint:any = {};
if (viewpoint.camera) {
// eslint-disable-next-line @typescript-eslint/naming-convention
const { position, up, forward: view_dir, type, size: orthographicSize } = viewpoint.camera;
v4Viewpoint = { position, up, view_dir, type, orthographicSize, look_at: null, account: null, model: null };
}

if (!isEmpty(viewpoint.state)) {
v4Viewpoint.hideIfc = !viewpoint.state.hidden;
}

if (!isEmpty(viewpoint.clippingPlanes)) {
v4Viewpoint.clippingPlanes = viewpoint.clippingPlanes;
}

// if (!isEmpty(viewpoint.state?.colored)) {
// v4Viewpoint.override_groups = viewpoint.state.colored.map(convertToV4Group);
// }

if (!isEmpty(viewpoint.state?.transformed)) {
v4Viewpoint.transformation_groups = viewpoint.state.transformed.map(convertToV4Group);
}

// if (!isEmpty(viewpoint.state?.hidden)) {
// v4Viewpoint.hidden_group = mergeGroups(viewpoint.state.hidden.map(convertToV4Group));
// }

return { viewpoint: v4Viewpoint };
};

export const meshObjectsToV5GroupNode = (objects) => objects.map((obj) => ({
container: obj.model,
_ids: obj.mesh_ids,
Expand All @@ -117,6 +175,8 @@ export const toGroupPropertiesDicts = (overrides: GroupOverride[]): OverridesDic
if (color !== undefined) {
// eslint-disable-next-line no-param-reassign
dict.overrides[id] = color;
} else {
dict.transparencies[id] = 0;
}

if (opacity !== undefined) {
Expand Down Expand Up @@ -145,20 +205,6 @@ export const toGroupPropertiesDicts = (overrides: GroupOverride[]): OverridesDic
}, { overrides: {}, transparencies: {} } as OverridesDicts);
};

const toTranformationsDict = (overrides: GroupOverride[]): MeshIdTransformDict => {
const dict: MeshIdTransformDict = {};

overrides.forEach((current) => {
const v4Objects = convertToV4GroupNodes((current.group as Group)?.objects || []);
v4Objects.forEach((obj) =>
obj.shared_ids.forEach((id) =>
dict[id] = current.transformation,
));
});

return dict;
};

export const goToView = async (view: Viewpoint) => {
if (
isEmpty(view?.state?.colored) &&
Expand All @@ -169,24 +215,19 @@ export const goToView = async (view: Viewpoint) => {
return;
}

dispatch(ViewerGuiActions.clearColorOverrides());
await ViewerService.setViewpoint(view);
// This is not very clean but will be fixed with the overrides refactor
dispatch(GroupsActions.clearColorOverridesSuccess());
dispatch(ViewpointsActions.clearColorOverrides());
dispatch(SequencesActions.clearColorOverrides());

const overrides = toGroupPropertiesDicts(view?.state?.colored || []);
TicketsCardActionsDispatchers.setOverrides(overrides);

const transformations = toTranformationsDict(view?.state?.transformed || []);
TicketsCardActionsDispatchers.setTransformations(transformations);

await ViewerService.clearHighlights();

if (view?.state) {
dispatch(TreeActions.setHiddenGeometryVisible(!!view.state.showHidden));
}

const v4HiddenObjects = convertToV4GroupNodes(view.state?.hidden?.flatMap((hiddenOverride) => (hiddenOverride.group as Group)?.objects || []));
if (v4HiddenObjects.length) {
dispatch(TreeActions.hideNodesBySharedIds(v4HiddenObjects, true));
} else {
dispatch(TreeActions.showAllNodes());
}

dispatch(ViewpointsActions.showViewpoint(null, null, viewpointV5ToV4(view)));
};
12 changes: 2 additions & 10 deletions frontend/src/v5/store/tickets/card/ticketsCard.redux.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import { produceAll } from '@/v5/helpers/reducers.helper';
import { Action } from 'redux';
import { createActions, createReducer } from 'reduxsauce';
import { Constants } from '@/v5/helpers/actions.helper';
import { EditableTicket, ITicketsFilters, MeshIdTransformDict, OverridesDicts } from '../tickets.types';
import { EditableTicket, ITicketsFilters, OverridesDicts } from '../tickets.types';

export const { Types: TicketsCardTypes, Creators: TicketsCardActions } = createActions({
setSelectedTicket: ['ticketId'],
Expand Down Expand Up @@ -111,11 +111,6 @@ export const setUnsavedTicket = (state: ITicketsCardState, { ticket }: SetUnsave
state.unsavedTicket = ticket;
}

export const setTransformations = (state: ITicketsCardState, { transformations }: SetTransformationsAction) => {
state.transformations = transformations;
};


export const resetState = ({ filters, readOnly }: ITicketsCardState) => ({
...INITIAL_STATE,
filters,
Expand All @@ -135,7 +130,6 @@ export const ticketsCardReducer = createReducer(INITIAL_STATE, produceAll({
[TicketsCardTypes.RESET_STATE]: resetState,
[TicketsCardTypes.SET_OVERRIDES]: setOverrides,
[TicketsCardTypes.SET_UNSAVED_TICKET]: setUnsavedTicket,
[TicketsCardTypes.SET_TRANSFORMATIONS]: setTransformations,
}));

export type SetSelectedTicketAction = Action<'SET_SELECTED_TICKET'> & { ticketId: string };
Expand All @@ -151,7 +145,6 @@ export type SetReadOnlyAction = Action<'SET_READ_ONLY'> & { readOnly: boolean };
export type ResetStateAction = Action<'RESET_STATE'>;
export type SetOverridesAction = Action<'SET_OVERRIDES'> & { overrides: OverridesDicts | null };
export type SetUnsavedTicketAction = Action<'SET_UNSAVED_TICKET'> & { ticket: EditableTicket };
export type SetTransformationsAction = Action<'SET_TRANSFORMATIONS'> & { transformations: OverridesDicts | null };

export interface ITicketsCardActionCreators {
setSelectedTicket: (ticketId: string) => SetSelectedTicketAction,
Expand All @@ -166,6 +159,5 @@ export interface ITicketsCardActionCreators {
setReadOnly: (readOnly: boolean) => SetReadOnlyAction,
resetState: () => ResetStateAction,
setOverrides: (overrides: OverridesDicts) => SetOverridesAction,
setUnsavedTicket: (ticket: EditableTicket) => SetUnsavedTicketAction,
setTransformations: (transformations: MeshIdTransformDict) => SetTransformationsAction
setUnsavedTicket: (ticket: EditableTicket) => SetUnsavedTicketAction
}
6 changes: 0 additions & 6 deletions frontend/src/v5/store/tickets/card/ticketsCard.selectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,12 +80,6 @@ export const selectTicketTransparencies = createSelector(
(overridesDicts) => overridesDicts.transparencies,
);

export const selectTicketTransformations = createSelector(
selectTicketsCardDomain,
(ticketCardState) => ticketCardState.transformations || {},
);


export const selectTicketHasClearedOverrides = createSelector(
selectTicketsCardDomain,
(ticketCardState) => !ticketCardState.overrides,
Expand Down

0 comments on commit 7b7c1fd

Please sign in to comment.