@buerli.io/react-cad 0.0.22-beta.0 → 0.0.23-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/build/components/UI/CAD/Messages/Message.d.ts +5 -0
  2. package/build/components/UI/CAD/Messages/Messages.d.ts +9 -0
  3. package/build/components/UI/CAD/Messages/index.d.ts +1 -0
  4. package/build/components/UI/CAD/Messages/msgStore.d.ts +17 -0
  5. package/build/components/UI/CAD/SideBar/FeatureList/Feature.d.ts +1 -1
  6. package/build/components/UI/CAD/SideBar/FeatureList/utils.d.ts +1 -0
  7. package/build/components/UI/CAD/common/BlankDiv.d.ts +4 -0
  8. package/build/components/UI/CAD/common/primitives.d.ts +4 -1
  9. package/build/components/UI/CAD/store/CADActions.d.ts +4 -0
  10. package/build/components/UI/CAD/store/CADStore.d.ts +4 -0
  11. package/build/index.cjs.js +1857 -1008
  12. package/build/index.js +1862 -1013
  13. package/build/plugins/Dimensions/index.d.ts +1 -1
  14. package/build/plugins/Sketch/Root/Details.d.ts +2 -0
  15. package/build/plugins/Sketch/Root/useMenuItems.d.ts +5 -0
  16. package/build/plugins/Sketch/View/graphics/Merged/Arc.d.ts +9 -0
  17. package/build/plugins/Sketch/View/graphics/Merged/Line.d.ts +10 -0
  18. package/build/plugins/Sketch/View/graphics/Merged/MergedWrapper.d.ts +11 -0
  19. package/build/plugins/Sketch/View/graphics/Merged/Point.d.ts +8 -0
  20. package/build/plugins/Sketch/View/graphics/graphics.d.ts +1 -2
  21. package/build/plugins/Sketch/View/graphics/hooks.d.ts +3 -1
  22. package/build/plugins/Sketch/View/graphics/primitives.d.ts +3 -3
  23. package/build/plugins/Sketch/View/graphics/scale.d.ts +4 -0
  24. package/build/plugins/Sketch/View/handlers/Handlers.d.ts +2 -0
  25. package/build/plugins/Sketch/View/handlers/UseRef.d.ts +3 -0
  26. package/build/plugins/Sketch/types.d.ts +1 -0
  27. package/build/plugins/Sketch/utils/Interaction.d.ts +4 -0
  28. package/build/utils/FileUtils.d.ts +1 -1
  29. package/build/utils/helpers.d.ts +2 -0
  30. package/package.json +9 -8
  31. package/build/plugins/Sketch/Root/UseRef.d.ts +0 -2
package/build/index.js CHANGED
@@ -1,37 +1,38 @@
1
- import { useDrawing, CameraHelper, useBuerli, usePlugin, useCamera, useEmbeddedPlugin, useGeometryInteraction, GlobalTransform, getCamera, Product, Canvas, Viewcube } from '@buerli.io/react';
1
+ import { useDrawing, CameraHelper, useBuerli, getCamera, usePlugin, useCamera, useEmbeddedPlugin, useGeometryInteraction, GlobalTransform, Product, useFeaturePluginDef, usePluginExists, Canvas, Viewcube } from '@buerli.io/react';
2
2
  import * as React from 'react';
3
3
  import React__default, { useMemo, useRef, useCallback, useState, useEffect, memo, useContext, useReducer } from 'react';
4
- import { getDrawing, createGraphicItem, GraphicType, MemberType, MathUtils, getPlugin, NOID, BuerliScope, Measure, MeasureResultType, api } from '@buerli.io/core';
4
+ import { getDrawing, createGraphicItem, GraphicType, MemberType, MathUtils, api, getPlugin, NOID, BuerliScope, Measure, MeasureResultType } from '@buerli.io/core';
5
5
  import { CCClasses, ccAPI, ReorientedType, FlipType, BooleanOperationType, ExtrusionType, ChamferType, WorkAxisType, WorkPlaneType, WorkPointType, WorkCoordSystemType, DataType } from '@buerli.io/classcad';
6
6
  import * as THREE from 'three';
7
7
  import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
8
8
  import { useFrame, useThree, createPortal, extend } from '@react-three/fiber';
9
- import { Html } from '@react-three/drei';
10
- import { ArrowUpOutlined, CheckOutlined, DeleteOutlined, PlusOutlined, EditOutlined, SelectOutlined, PlusSquareOutlined, ExportOutlined, CloseOutlined, EyeFilled, EyeOutlined, CaretRightOutlined, CaretDownOutlined, AppstoreOutlined, FileOutlined, LeftOutlined, AppstoreAddOutlined, CheckCircleTwoTone, CloseCircleTwoTone, ExpandAltOutlined, CodeSandboxOutlined, FontSizeOutlined, DownOutlined } from '@ant-design/icons';
9
+ import { Html, useCursor, Merged } from '@react-three/drei';
10
+ import create from 'zustand';
11
+ import vanilla from 'zustand/vanilla';
12
+ import 'antd/dist/antd.css';
13
+ import { ArrowUpOutlined, CheckOutlined, CaretRightOutlined, CaretDownOutlined, EditOutlined, DeleteOutlined, PlusOutlined, SelectOutlined, PlusSquareOutlined, ExportOutlined, CloseOutlined, EyeFilled, EyeOutlined, ExclamationCircleTwoTone, AppstoreOutlined, FileOutlined, LeftOutlined, AppstoreAddOutlined, CheckCircleTwoTone, CloseCircleTwoTone, ExpandAltOutlined, CodeSandboxOutlined, FontSizeOutlined, DownOutlined, InfoCircleTwoTone, UnorderedListOutlined } from '@ant-design/icons';
11
14
  import _extends from '@babel/runtime/helpers/esm/extends';
12
15
  import Switch from 'antd/lib/switch';
16
+ import AntdButton from 'antd/lib/button';
13
17
  import _objectWithoutProperties from '@babel/runtime/helpers/esm/objectWithoutProperties';
14
18
  import styled, { keyframes } from 'styled-components';
15
19
  import Tooltip from 'antd/lib/tooltip';
16
20
  import RadioGroupImpl from 'antd/lib/radio/group';
17
21
  import RadioButtonImpl from 'antd/lib/radio/radioButton';
22
+ import { Menu as Menu$1, Dropdown, Input, Typography, Space, Table, Tabs, Divider as Divider$1, Button, Tooltip as Tooltip$1, Modal, Badge } from 'antd';
18
23
  import guid from 'uuid';
19
24
  import shallow from 'zustand/shallow';
20
25
  import { Geometry } from 'three-stdlib';
21
26
  import SelectImpl from 'antd/lib/select';
22
27
  import { basename, extname } from 'path';
23
- import { Menu as Menu$1, Dropdown, Input, Table, Space, Typography, Tabs, Divider as Divider$1, Button, Tooltip as Tooltip$1, Modal } from 'antd';
24
- import 'antd/dist/antd.css';
25
- import create from 'zustand';
26
- import vanilla from 'zustand/vanilla';
27
28
  import { useUID } from 'react-uid';
28
29
  import * as deepmerge from 'deepmerge';
29
30
  import { SortableContainer, SortableElement } from 'react-sortable-hoc';
30
31
  import { RgbaColorPicker } from 'react-colorful';
31
32
 
32
- function ownKeys$k(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
33
+ function ownKeys$m(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
33
34
 
34
- function _objectSpread$k(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$k(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$k(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
35
+ function _objectSpread$m(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$m(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$m(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
35
36
  function getGraphicId(tree, refOrObjId) {
36
37
  const res = {
37
38
  graphicId: refOrObjId,
@@ -103,7 +104,7 @@ function useSelectedItems(drawingId, refOrObjIds) {
103
104
  }
104
105
 
105
106
  const createSelItem = React__default.useCallback(element => {
106
- return createGraphicItem(prodId, _objectSpread$k(_objectSpread$k({}, element), {}, {
107
+ return createGraphicItem(prodId, _objectSpread$m(_objectSpread$m({}, element), {}, {
107
108
  productId: prodId
108
109
  }));
109
110
  }, [prodId]);
@@ -134,7 +135,7 @@ function useSelectedItems(drawingId, refOrObjIds) {
134
135
  const elem = cont.map[Number(grIds[0])];
135
136
 
136
137
  if (elem) {
137
- elems.push(_objectSpread$k(_objectSpread$k({}, elem), {}, {
138
+ elems.push(_objectSpread$m(_objectSpread$m({}, elem), {}, {
138
139
  graphicId: contId,
139
140
  type: GraphicType.SOLID
140
141
  }));
@@ -172,9 +173,9 @@ function useSelectedItems(drawingId, refOrObjIds) {
172
173
  return selectedItems;
173
174
  }
174
175
 
175
- function ownKeys$j(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
176
+ function ownKeys$l(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
176
177
 
177
- function _objectSpread$j(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$j(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$j(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
178
+ function _objectSpread$l(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$l(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$l(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
178
179
  function addMembers(drawingId, ccObjId) {
179
180
  const drawingState = getDrawing(drawingId);
180
181
  const objInTree = drawingState.structure.tree[ccObjId];
@@ -187,7 +188,7 @@ function addMembers(drawingId, ccObjId) {
187
188
  const members = {};
188
189
  Object.keys(curMembers).forEach(memberName => {
189
190
  const curMember = curMembers[memberName];
190
- members[memberName] = _objectSpread$j(_objectSpread$j({}, curMember), {}, {
191
+ members[memberName] = _objectSpread$l(_objectSpread$l({}, curMember), {}, {
191
192
  name: memberName
192
193
  });
193
194
 
@@ -307,6 +308,10 @@ function getAncestorIdByClass(drawingId, objectId, parentClass) {
307
308
 
308
309
  return object.parent;
309
310
  }
311
+ const isSketchGeometry = arg => {
312
+ const objClass = typeof arg === 'string' ? arg : arg.class;
313
+ return objClass === CCClasses.CCPoint || objClass === CCClasses.CCLine || objClass === CCClasses.CCArc || objClass === CCClasses.CCCircle;
314
+ };
310
315
  const is2DConstraint = arg => {
311
316
  const objClass = typeof arg === 'string' ? arg : arg.class;
312
317
  return Boolean(objClass.match(/CC_2D.+Constraint/)) || objClass === CCClasses.CCRigidSet;
@@ -415,6 +420,12 @@ function fmod(num, denom) {
415
420
  k = k < 0 ? k + 1 : k;
416
421
  return num - k * denom;
417
422
  }
423
+ function numberToHexColor(color) {
424
+ const hexLen = 6;
425
+ const hexStr = color.toString(16);
426
+ const zeroNumber = hexLen - hexStr.length;
427
+ return '#' + '0'.repeat(zeroNumber) + hexStr;
428
+ }
418
429
 
419
430
  const DimContext = /*#__PURE__*/React__default.createContext({
420
431
  globalToLocalM: new THREE.Matrix4(),
@@ -422,7 +433,7 @@ const DimContext = /*#__PURE__*/React__default.createContext({
422
433
  drawingId: -1
423
434
  });
424
435
 
425
- function useScale(position, getVector) {
436
+ function useScale$1(position, getVector) {
426
437
  const ref = React__default.useRef();
427
438
  useFrame(args => {
428
439
  const sf = CameraHelper.calculateScaleFactor(position, 1, args.camera, args.size);
@@ -867,6 +878,133 @@ const isAngular = dim => {
867
878
  return dim.class === CCClasses.CCAngularDimension || dim.class === CCClasses.CCAngularFeatureDimension || dim.class === CCClasses.CCAngularRefDimension;
868
879
  };
869
880
 
881
+ const zoomToFit = drawingId => {
882
+ var _getCamera;
883
+
884
+ const drawing = getDrawing(drawingId);
885
+ const camApi = (_getCamera = getCamera(drawingId)) == null ? void 0 : _getCamera.api;
886
+
887
+ if (!drawing || !camApi) {
888
+ return;
889
+ }
890
+
891
+ const {
892
+ structure,
893
+ api: drawingApi
894
+ } = drawing;
895
+ const {
896
+ root,
897
+ currentProduct,
898
+ currentNode
899
+ } = structure;
900
+ let currRoot = currentNode || currentProduct || root;
901
+
902
+ if (currentProduct && structure.tree[currentProduct].class === 'CC_Part') {
903
+ currRoot = currentProduct;
904
+ }
905
+
906
+ const bounds = drawingApi.structure.calculateProductBounds(currRoot);
907
+ camApi.setZoom('fit', bounds);
908
+ };
909
+
910
+ function ownKeys$k(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
911
+
912
+ function _objectSpread$k(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$k(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$k(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
913
+ const appApi = (set, get) => ({
914
+ assemblyTree: {
915
+ startProdEditing: (drawingId, objId) => {
916
+ set(state => {
917
+ let res = [];
918
+ const curNode = api.getState().drawing.refs[drawingId].structure.currentNode;
919
+ res = state.assemblyTree.prodStack;
920
+ curNode && res.push(curNode);
921
+ return _objectSpread$k(_objectSpread$k({}, state), {}, {
922
+ assemblyTree: {
923
+ prodStack: [...res]
924
+ }
925
+ });
926
+ });
927
+ ccAPI.assemblyBuilder.setCurrentNode(drawingId, objId).then(() => zoomToFit(drawingId)).catch();
928
+ },
929
+ goBack: drawingId => {
930
+ const prodStack = get().assemblyTree.prodStack;
931
+ const prevProd = prodStack[prodStack.length - 1];
932
+ if (!prevProd) return;
933
+ set(state => {
934
+ const res = state.assemblyTree.prodStack;
935
+ res.pop();
936
+ return _objectSpread$k(_objectSpread$k({}, state), {}, {
937
+ assemblyTree: {
938
+ prodStack: [...res]
939
+ }
940
+ });
941
+ });
942
+ ccAPI.assemblyBuilder.setCurrentNode(drawingId, prevProd).then(() => zoomToFit(drawingId)).catch();
943
+ },
944
+ clearProdStack: () => {
945
+ set(state => _objectSpread$k(_objectSpread$k({}, state), {}, {
946
+ assemblyTree: {
947
+ prodStack: []
948
+ }
949
+ }));
950
+ }
951
+ },
952
+ blankDiv: {
953
+ show: callback => {
954
+ set(state => _objectSpread$k(_objectSpread$k({}, state), {}, {
955
+ blankDiv: {
956
+ isActive: true,
957
+ onClose: callback
958
+ }
959
+ }));
960
+ },
961
+ hide: () => {
962
+ set(state => _objectSpread$k(_objectSpread$k({}, state), {}, {
963
+ blankDiv: {
964
+ isActive: false,
965
+ onClose: undefined
966
+ }
967
+ }));
968
+ }
969
+ }
970
+ });
971
+
972
+ const createAppState = (set, get) => ({
973
+ assemblyTree: {
974
+ prodStack: []
975
+ },
976
+ blankDiv: {
977
+ isActive: false,
978
+ onClose: undefined
979
+ },
980
+ api: appApi(set, get)
981
+ });
982
+
983
+ const CADApi = vanilla((set, get) => createAppState(set, get));
984
+ const useCADStore = create(CADApi);
985
+ const getCADState = CADApi.getState;
986
+
987
+ const blankZIndex = 1000;
988
+ const BlankDiv = () => {
989
+ const isActive = useCADStore(s => s.blankDiv.isActive);
990
+ const onClick = React__default.useCallback(() => {
991
+ const cadState = getCADState();
992
+ cadState.blankDiv.onClose && cadState.blankDiv.onClose();
993
+ cadState.api.blankDiv.hide();
994
+ }, []);
995
+ return isActive ? /*#__PURE__*/React__default.createElement("div", {
996
+ onClick: onClick,
997
+ style: {
998
+ zIndex: blankZIndex,
999
+ position: 'fixed',
1000
+ top: 0,
1001
+ left: 0,
1002
+ bottom: 0,
1003
+ right: 0
1004
+ }
1005
+ }) : null;
1006
+ };
1007
+
870
1008
  const mainColor = 0x424242;
871
1009
  const lineWidth$1 = 0.5;
872
1010
  const arrowSize = 5;
@@ -890,7 +1028,7 @@ const TextValue = ({
890
1028
  backgroundColor: backgroundColor ? `#${backgroundColor.toString(16)}` : undefined,
891
1029
  color: `#${mainColor.toString(16)}`,
892
1030
  fontSize: '17px',
893
- cursor: 'pointer'
1031
+ cursor: 'text'
894
1032
  }
895
1033
  }, value)));
896
1034
  };
@@ -927,6 +1065,12 @@ const DimValue = ({
927
1065
  return expr ? expr + ' (' + value.toFixed(2) + ')' : value.toFixed(2);
928
1066
  }, [master, dimension, memberName]);
929
1067
  const [editMode, setEditMode] = React__default.useState(false);
1068
+ React__default.useEffect(() => {
1069
+ if (editMode) {
1070
+ getCADState().api.blankDiv.show(() => setEditMode(false));
1071
+ return () => getCADState().api.blankDiv.hide();
1072
+ }
1073
+ }, [editMode, setEditMode]);
930
1074
  const update = React__default.useCallback(() => {
931
1075
  const master_ = getDrawing(drawingId).structure.tree[masterId];
932
1076
 
@@ -969,7 +1113,7 @@ const DimValue = ({
969
1113
  return /*#__PURE__*/React__default.createElement("group", {
970
1114
  position: position
971
1115
  }, /*#__PURE__*/React__default.createElement(Html, {
972
- zIndexRange: [0, 0],
1116
+ zIndexRange: [blankZIndex + 1, blankZIndex + 1],
973
1117
  style: {
974
1118
  marginTop: '22px'
975
1119
  },
@@ -984,7 +1128,7 @@ const DimValue = ({
984
1128
  backgroundColor: backgroundColor ? `#${backgroundColor.toString(16)}` : undefined,
985
1129
  color: `#${mainColor.toString(16)}`,
986
1130
  fontSize: '17px',
987
- cursor: 'pointer'
1131
+ cursor: 'text'
988
1132
  }
989
1133
  }, caption) : /*#__PURE__*/React__default.createElement("div", {
990
1134
  style: {
@@ -996,14 +1140,14 @@ const DimValue = ({
996
1140
  allowExpr: true
997
1141
  })))));
998
1142
  };
999
- const Line$1 = ({
1143
+ const Line$2 = ({
1000
1144
  start,
1001
1145
  end
1002
1146
  }) => {
1003
1147
  const position = React__default.useMemo(() => new THREE.Vector3().lerpVectors(start, end, 0.5), [start, end]);
1004
1148
  const quaternion = React__default.useMemo(() => new THREE.Quaternion().setFromUnitVectors(new THREE.Vector3(0, 1, 0), end.clone().sub(start).normalize()), [start, end]);
1005
1149
  const lineLength = start.distanceTo(end);
1006
- const ref = useScale(position, scaleF => [lineWidth$1 * scaleF, lineLength, lineWidth$1 * scaleF]);
1150
+ const ref = useScale$1(position, scaleF => [lineWidth$1 * scaleF, lineLength, lineWidth$1 * scaleF]);
1007
1151
  return lineLength === 0 ? null : /*#__PURE__*/React__default.createElement("mesh", {
1008
1152
  ref: ref,
1009
1153
  position: position,
@@ -1026,7 +1170,7 @@ const Arrow$1 = ({
1026
1170
  // Move arrow that end of the arrow will be at props.end
1027
1171
  geomRef.current && geomRef.current.translate(0, -0.5, 0);
1028
1172
  }, [geomRef]);
1029
- const ref = useScale(position, sf => [arrowSize * sf, arrowSize * 2 * sf, arrowSize * sf]);
1173
+ const ref = useScale$1(position, sf => [arrowSize * sf, arrowSize * 2 * sf, arrowSize * sf]);
1030
1174
  return /*#__PURE__*/React__default.createElement("mesh", {
1031
1175
  ref: ref,
1032
1176
  position: position,
@@ -1055,7 +1199,7 @@ const Arc$1 = ({
1055
1199
  lines.push(linePos);
1056
1200
  }
1057
1201
 
1058
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, lines.map((line, i) => /*#__PURE__*/React__default.createElement(Line$1, {
1202
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, lines.map((line, i) => /*#__PURE__*/React__default.createElement(Line$2, {
1059
1203
  key: i,
1060
1204
  start: line[0],
1061
1205
  end: line[1]
@@ -1082,7 +1226,9 @@ const PositionHandler = ({
1082
1226
  const {
1083
1227
  camera
1084
1228
  } = useThree();
1085
- const ref = useScale(position, sf => [hRadius$1 * sf, hRadius$1 * sf, hRadius$1 * sf]);
1229
+ const ref = useScale$1(position, sf => [hRadius$1 * sf, hRadius$1 * sf, hRadius$1 * sf]);
1230
+ const [isHovered, setIsHovered] = React__default.useState(false);
1231
+ useCursor(isHovered, 'move');
1086
1232
  const onPointerDown = React__default.useCallback(e => {
1087
1233
  if (e.buttons !== 1) // Continue only if 'primary' mouse button is pressed
1088
1234
  return;
@@ -1122,6 +1268,10 @@ const PositionHandler = ({
1122
1268
  te.target.releasePointerCapture(te.pointerId);
1123
1269
  te.stopPropagation();
1124
1270
  }, [dimId, drawingId, position, setPState]);
1271
+ const onPointerOver = React__default.useCallback(e => {
1272
+ setIsHovered(true);
1273
+ e.stopPropagation();
1274
+ }, []);
1125
1275
  const onPointerMove = React__default.useCallback(e => {
1126
1276
  if (isPressed.current) {
1127
1277
  isDragged.current = true;
@@ -1131,12 +1281,18 @@ const PositionHandler = ({
1131
1281
 
1132
1282
  e.stopPropagation();
1133
1283
  }, [setPosition, globalToLocalM, camera]);
1284
+ const onPointerOut = React__default.useCallback(e => {
1285
+ setIsHovered(false);
1286
+ e.stopPropagation();
1287
+ }, []);
1134
1288
  return /*#__PURE__*/React__default.createElement("mesh", {
1135
1289
  ref: ref,
1136
1290
  position: position,
1137
1291
  onPointerDown: onPointerDown,
1138
1292
  onPointerMove: onPointerMove,
1139
- onPointerUp: onPointerUp
1293
+ onPointerUp: onPointerUp,
1294
+ onPointerOver: onPointerOver,
1295
+ onPointerOut: onPointerOut
1140
1296
  }, /*#__PURE__*/React__default.createElement("sphereGeometry", {
1141
1297
  args: [1.5, 16, 16]
1142
1298
  }), /*#__PURE__*/React__default.createElement("meshBasicMaterial", {
@@ -1187,16 +1343,16 @@ const LinearDim = ({
1187
1343
  endDir: endD
1188
1344
  };
1189
1345
  }, [members, tmpDimP]);
1190
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Line$1, {
1346
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Line$2, {
1191
1347
  start: startFoot,
1192
1348
  end: tmpDimP
1193
- }), /*#__PURE__*/React__default.createElement(Line$1, {
1349
+ }), /*#__PURE__*/React__default.createElement(Line$2, {
1194
1350
  start: tmpDimP,
1195
1351
  end: endFoot
1196
- }), /*#__PURE__*/React__default.createElement(Line$1, {
1352
+ }), /*#__PURE__*/React__default.createElement(Line$2, {
1197
1353
  start: startP,
1198
1354
  end: startFoot
1199
- }), /*#__PURE__*/React__default.createElement(Line$1, {
1355
+ }), /*#__PURE__*/React__default.createElement(Line$2, {
1200
1356
  start: endP,
1201
1357
  end: endFoot
1202
1358
  }), /*#__PURE__*/React__default.createElement(Arrow$1, {
@@ -1242,10 +1398,10 @@ const RadialDim = ({
1242
1398
  dir: outside ? dir_.multiplyScalar(-1) : dir_
1243
1399
  };
1244
1400
  }, [members, tmpDimP]);
1245
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Line$1, {
1401
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Line$2, {
1246
1402
  start: centerP,
1247
1403
  end: endP
1248
- }), /*#__PURE__*/React__default.createElement(Line$1, {
1404
+ }), /*#__PURE__*/React__default.createElement(Line$2, {
1249
1405
  start: endP,
1250
1406
  end: dimP
1251
1407
  }), /*#__PURE__*/React__default.createElement(Arrow$1, {
@@ -1289,10 +1445,10 @@ const DiametralDim = ({
1289
1445
  dirEnd: outside ? dir.clone().multiplyScalar(-1) : dir
1290
1446
  };
1291
1447
  }, [members, tmpDimP]);
1292
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Line$1, {
1448
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Line$2, {
1293
1449
  start: startP,
1294
1450
  end: tmpDimP
1295
- }), /*#__PURE__*/React__default.createElement(Line$1, {
1451
+ }), /*#__PURE__*/React__default.createElement(Line$2, {
1296
1452
  start: tmpDimP,
1297
1453
  end: endP
1298
1454
  }), /*#__PURE__*/React__default.createElement(Arrow$1, {
@@ -1368,10 +1524,10 @@ const AngularDim = ({
1368
1524
  endL2: extendCrn ? corner : end
1369
1525
  };
1370
1526
  }, [members, tmpDimP]);
1371
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Line$1, {
1527
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Line$2, {
1372
1528
  start: startL1,
1373
1529
  end: startFoot
1374
- }), /*#__PURE__*/React__default.createElement(Line$1, {
1530
+ }), /*#__PURE__*/React__default.createElement(Line$2, {
1375
1531
  start: endFoot,
1376
1532
  end: endL2
1377
1533
  }), /*#__PURE__*/React__default.createElement(Arc$1, {
@@ -1446,13 +1602,14 @@ var DimGraphics$1 = DimGraphics;
1446
1602
  /**
1447
1603
  * @see https://reactjs.org/docs/error-boundaries.html
1448
1604
  */
1449
-
1605
+ const isDev = process.env.NODE_ENV === 'development';
1450
1606
  /**
1451
1607
  * Wrapper for components which are exported from package.
1452
1608
  * It's intended to catch all errors and show friendly fallback to the user instead of error log.
1453
1609
  * By default it returns null in error case. You have to pass showHtml prop to show message to the user.
1454
1610
  * TODO: implement message showing.
1455
1611
  */
1612
+
1456
1613
  class ErrorBoundary extends React__default.Component {
1457
1614
  constructor(props) {
1458
1615
  super(props);
@@ -1481,7 +1638,7 @@ class ErrorBoundary extends React__default.Component {
1481
1638
  Object.values(warns).forEach(w => {
1482
1639
  if (w) {
1483
1640
  hasWarning = true;
1484
- console.warn(w.caption);
1641
+ isDev && console.warn(w.caption);
1485
1642
  }
1486
1643
  });
1487
1644
  }
@@ -1929,9 +2086,9 @@ var index$w = /*#__PURE__*/Object.freeze({
1929
2086
  useDimensionSetId: useDimensionSetId
1930
2087
  });
1931
2088
 
1932
- function ownKeys$i(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
2089
+ function ownKeys$j(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
1933
2090
 
1934
- function _objectSpread$i(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$i(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$i(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
2091
+ function _objectSpread$j(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$j(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$j(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
1935
2092
  /**
1936
2093
  * Implies the following data structure:
1937
2094
  * data: {
@@ -2034,7 +2191,7 @@ function useMateSelection(drawingId, matePath, csysId) {
2034
2191
  }));
2035
2192
  const handlers = React__default.useMemo(() => {
2036
2193
  if (isSelectable) {
2037
- return _objectSpread$i(_objectSpread$i({}, hHandlers), sHandlers);
2194
+ return _objectSpread$j(_objectSpread$j({}, hHandlers), sHandlers);
2038
2195
  }
2039
2196
 
2040
2197
  return {};
@@ -2050,9 +2207,9 @@ function useMateSelection(drawingId, matePath, csysId) {
2050
2207
  }, [isHovered, isSelected, isSelectable, handlers]);
2051
2208
  }
2052
2209
 
2053
- function ownKeys$h(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
2210
+ function ownKeys$i(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
2054
2211
 
2055
- function _objectSpread$h(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$h(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$h(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
2212
+ function _objectSpread$i(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$i(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$i(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
2056
2213
  /**
2057
2214
  * Implies the following data structure:
2058
2215
  * data: {
@@ -2071,7 +2228,8 @@ const createTreeObjSelItem = (productId, object) => {
2071
2228
  data: {
2072
2229
  object
2073
2230
  },
2074
- label
2231
+ label,
2232
+ removeCondition: d => d.structure.tree[object.id] === undefined
2075
2233
  };
2076
2234
  };
2077
2235
 
@@ -2180,7 +2338,7 @@ function useTreeObjSelection(drawingId, objId) {
2180
2338
  const isSelected = useIsSelected(drawingId, objId);
2181
2339
  const handlers = React__default.useMemo(() => {
2182
2340
  if (isSelectable) {
2183
- return _objectSpread$h(_objectSpread$h({}, hHandlers), sHandlers);
2341
+ return _objectSpread$i(_objectSpread$i({}, hHandlers), sHandlers);
2184
2342
  }
2185
2343
 
2186
2344
  return {};
@@ -5004,7 +5162,7 @@ const Root$g = ({
5004
5162
  }));
5005
5163
  };
5006
5164
 
5007
- const Point$1 = ({
5165
+ const Point$2 = ({
5008
5166
  position,
5009
5167
  radius,
5010
5168
  color,
@@ -5076,7 +5234,7 @@ const OriginPoint = ({
5076
5234
  handlers,
5077
5235
  userData
5078
5236
  }) => {
5079
- return /*#__PURE__*/React__default.createElement(Point$1, {
5237
+ return /*#__PURE__*/React__default.createElement(Point$2, {
5080
5238
  position: position ? position.clone() : new THREE.Vector3(),
5081
5239
  radius: 2,
5082
5240
  color: color,
@@ -5117,7 +5275,7 @@ const Csys = ({
5117
5275
  userData
5118
5276
  }) => {
5119
5277
  const position = new THREE.Vector3().setFromMatrixPosition(matrix);
5120
- const ref = useScale(position.clone(), sf => [2 * sf, 2 * sf, 2 * sf]);
5278
+ const ref = useScale$1(position.clone(), sf => [2 * sf, 2 * sf, 2 * sf]);
5121
5279
  return /*#__PURE__*/React__default.createElement("group", _extends({
5122
5280
  matrix: matrix,
5123
5281
  matrixAutoUpdate: false
@@ -5156,7 +5314,7 @@ const SelectedCsys = ({
5156
5314
  userData
5157
5315
  }) => {
5158
5316
  const position = new THREE.Vector3().setFromMatrixPosition(matrix);
5159
- const ref = useScale(position.clone(), sf => [2 * sf, 2 * sf, 2 * sf]);
5317
+ const ref = useScale$1(position.clone(), sf => [2 * sf, 2 * sf, 2 * sf]);
5160
5318
  return /*#__PURE__*/React__default.createElement("group", _extends({
5161
5319
  matrix: matrix,
5162
5320
  matrixAutoUpdate: false
@@ -5231,7 +5389,7 @@ const Distance = ({
5231
5389
  setShowValue(true);
5232
5390
  }
5233
5391
  });
5234
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Line$1, {
5392
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Line$2, {
5235
5393
  start: start,
5236
5394
  end: end
5237
5395
  }), /*#__PURE__*/React__default.createElement(Arrow$1, {
@@ -5318,10 +5476,10 @@ const Angle = ({
5318
5476
  setShowValue(true);
5319
5477
  }
5320
5478
  });
5321
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Line$1, {
5479
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Line$2, {
5322
5480
  start: center,
5323
5481
  end: end1
5324
- }), /*#__PURE__*/React__default.createElement(Line$1, {
5482
+ }), /*#__PURE__*/React__default.createElement(Line$2, {
5325
5483
  start: center,
5326
5484
  end: end2
5327
5485
  }), /*#__PURE__*/React__default.createElement("group", {
@@ -5348,7 +5506,7 @@ const Position = ({
5348
5506
  pos,
5349
5507
  result
5350
5508
  }) => {
5351
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Point$1, {
5509
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Point$2, {
5352
5510
  position: pos,
5353
5511
  radius: 1.5,
5354
5512
  color: 0xaf1111
@@ -5363,7 +5521,7 @@ const Vector = ({
5363
5521
  end
5364
5522
  }) => {
5365
5523
  const dir = end.clone().sub(start);
5366
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Line$1, {
5524
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Line$2, {
5367
5525
  start: start,
5368
5526
  end: end
5369
5527
  }), /*#__PURE__*/React__default.createElement(Arrow$1, {
@@ -5490,6 +5648,7 @@ let HandlersList;
5490
5648
  HandlersList["FILLET"] = "fillet";
5491
5649
  HandlersList["HOVER"] = "hover";
5492
5650
  HandlersList["TRIM"] = "trim";
5651
+ HandlersList["USEREF"] = "useReference";
5493
5652
  HandlersList["GSELECTION"] = "globalSelection";
5494
5653
  })(HandlersList || (HandlersList = {}));
5495
5654
 
@@ -5526,7 +5685,7 @@ const calcPreviewValue = (dir0, dir1, sector, reflex) => {
5526
5685
 
5527
5686
  const hRadius = 6;
5528
5687
  const TmpPositionHandler = props => {
5529
- const ref = useScale(props.position, sf => [hRadius * sf, hRadius * sf, hRadius * sf]);
5688
+ const ref = useScale$1(props.position, sf => [hRadius * sf, hRadius * sf, hRadius * sf]);
5530
5689
  return /*#__PURE__*/React__default.createElement("mesh", {
5531
5690
  ref: ref,
5532
5691
  position: props.position
@@ -5638,10 +5797,10 @@ const TmpAngularDim = props => {
5638
5797
  };
5639
5798
  }, [dir0, dir1, center, dimPos, reflex]);
5640
5799
  const text = radiansToDegrees(previewValue).toFixed(2);
5641
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Line$1, {
5800
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Line$2, {
5642
5801
  start: cornerP,
5643
5802
  end: startFoot
5644
- }), /*#__PURE__*/React__default.createElement(Line$1, {
5803
+ }), /*#__PURE__*/React__default.createElement(Line$2, {
5645
5804
  start: endFoot,
5646
5805
  end: cornerP
5647
5806
  }), /*#__PURE__*/React__default.createElement(Arc$1, {
@@ -5702,9 +5861,9 @@ function getSketchState(drawingId, pluginId) {
5702
5861
  return plugin.state;
5703
5862
  }
5704
5863
 
5705
- function ownKeys$g(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
5864
+ function ownKeys$h(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
5706
5865
 
5707
- function _objectSpread$g(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$g(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$g(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
5866
+ function _objectSpread$h(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$h(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$h(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
5708
5867
  function CreateAngle(drawingId, pluginId) {
5709
5868
  const {
5710
5869
  set
@@ -5754,8 +5913,8 @@ function CreateAngle(drawingId, pluginId) {
5754
5913
  set(state_ => {
5755
5914
  const tmpAngularDimension = state_.tmpObjects[tmpDimensionId];
5756
5915
  return {
5757
- tmpObjects: _objectSpread$g(_objectSpread$g({}, state_.tmpObjects), {}, {
5758
- [tmpDimensionId]: _objectSpread$g(_objectSpread$g({}, tmpAngularDimension), params)
5916
+ tmpObjects: _objectSpread$h(_objectSpread$h({}, state_.tmpObjects), {}, {
5917
+ [tmpDimensionId]: _objectSpread$h(_objectSpread$h({}, tmpAngularDimension), params)
5759
5918
  })
5760
5919
  };
5761
5920
  });
@@ -5802,7 +5961,7 @@ function CreateAngle(drawingId, pluginId) {
5802
5961
  const center = linesInfo.center;
5803
5962
  const dimPos = center.clone().addScaledVector(dir0.clone().add(dir1).normalize(), 10);
5804
5963
 
5805
- const tmpAngularDimension = _objectSpread$g(_objectSpread$g({
5964
+ const tmpAngularDimension = _objectSpread$h(_objectSpread$h({
5806
5965
  class: CCClasses.CCAngularDimension,
5807
5966
  id: tmpDimensionId
5808
5967
  }, linesInfo), {}, {
@@ -5882,12 +6041,105 @@ function CreateAngle(drawingId, pluginId) {
5882
6041
  };
5883
6042
  }
5884
6043
 
5885
- function ownKeys$f(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
6044
+ function ownKeys$g(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
5886
6045
 
5887
- function _objectSpread$f(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$f(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$f(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
5888
- function Hover(drawingId, pluginId) {
5889
- let timerId;
6046
+ function _objectSpread$g(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$g(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$g(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
6047
+ let timerId;
6048
+ const hover = (drawingId, pluginId, hoveredId) => {
6049
+ const {
6050
+ state,
6051
+ set
6052
+ } = getPlugin(drawingId, pluginId);
6053
+ const tree = getDrawing(drawingId).structure.tree;
6054
+ const hoveredObject = tree[hoveredId];
6055
+
6056
+ if (!hoveredObject || hoveredObject && hoveredObject.class === CCClasses.CCSketch || state.rubberBandRectangle) {
6057
+ return;
6058
+ }
6059
+
6060
+ if (is2DConstraint(hoveredObject)) {
6061
+ const constraintEntities = hoveredObject.members.entities.members.map(entity => entity.value);
6062
+ set(state_ => {
6063
+ const highlighted = state_.highlighted;
6064
+ const highlightedConstraints = highlighted.filter(id => is2DConstraint(tree[id]) && id !== hoveredId);
6065
+ return {
6066
+ hovered: hoveredId,
6067
+ highlighted: [...highlightedConstraints, hoveredId, ...constraintEntities]
6068
+ };
6069
+ });
6070
+ } else {
6071
+ const linkedConstraints = Object.values(tree).filter(obj => is2DConstraint(obj)).filter(obj => obj.members.entities.members.some(entity => entity.value === hoveredId)).map(obj => obj.id);
6072
+ const constraintsToGeometry = {};
6073
+ linkedConstraints.forEach(id => {
6074
+ constraintsToGeometry[id] = hoveredId;
6075
+ });
6076
+ set(state_ => {
6077
+ return {
6078
+ hovered: hoveredId,
6079
+ highlighted: [hoveredId, ...linkedConstraints],
6080
+ constraintsToGeometry: _objectSpread$g(_objectSpread$g({}, state_.constraintsToGeometry), constraintsToGeometry)
6081
+ };
6082
+ });
6083
+ }
6084
+
6085
+ if (timerId) {
6086
+ window.clearTimeout(timerId);
6087
+ timerId = undefined;
6088
+ }
6089
+ };
6090
+ const unhover = (drawingId, pluginId, hoveredId) => {
6091
+ const {
6092
+ state,
6093
+ set
6094
+ } = getPlugin(drawingId, pluginId);
6095
+ const tree = getDrawing(drawingId).structure.tree;
6096
+ const hoveredObject = tree[hoveredId];
6097
+
6098
+ if (!hoveredObject || hoveredObject && hoveredObject.class === CCClasses.CCSketch || state.rubberBandRectangle) {
6099
+ return;
6100
+ }
6101
+
6102
+ set(state_ => {
6103
+ const highlighted = state_.highlighted;
6104
+ const highlightedConstraints = highlighted.filter(id => is2DConstraint(tree[id]));
6105
+ return {
6106
+ hovered: state_.hovered === hoveredId ? UNDEFINEDID : state_.hovered,
6107
+ highlighted: highlightedConstraints
6108
+ };
6109
+ });
6110
+
6111
+ if (timerId) {
6112
+ window.clearTimeout(timerId);
6113
+ }
6114
+
6115
+ timerId = window.setTimeout(() => {
6116
+ set({
6117
+ highlighted: []
6118
+ });
6119
+ }, 1000);
6120
+ };
6121
+ const select = (drawingId, pluginId, selectedId) => {
6122
+ const {
6123
+ set
6124
+ } = getPlugin(drawingId, pluginId);
6125
+ set(state => {
6126
+ const curSelected = state.selected;
6127
+
6128
+ if (curSelected.indexOf(selectedId) >= 0) {
6129
+ const newSelected = curSelected.filter(id => id !== selectedId);
6130
+ return {
6131
+ selected: newSelected
6132
+ };
6133
+ } else {
6134
+ curSelected.push(selectedId);
6135
+ return {
6136
+ selected: [...curSelected]
6137
+ };
6138
+ }
6139
+ });
6140
+ };
5890
6141
 
6142
+ function Hover(drawingId, pluginId) {
5891
6143
  const filter = object => true;
5892
6144
 
5893
6145
  const destructor = () => {
@@ -5900,81 +6152,14 @@ function Hover(drawingId, pluginId) {
5900
6152
  };
5901
6153
 
5902
6154
  const onPointerOver = e => {
5903
- const {
5904
- state,
5905
- set
5906
- } = getPlugin(drawingId, pluginId);
5907
6155
  const hoveredId = e.object.userData.objId;
5908
- const tree = getDrawing(drawingId).structure.tree;
5909
- const hoveredObject = tree[hoveredId];
6156
+ hover(drawingId, pluginId, hoveredId);
5910
6157
  e.stopPropagation();
5911
-
5912
- if (!hoveredObject || hoveredObject && hoveredObject.class === CCClasses.CCSketch || state.rubberBandRectangle) {
5913
- return;
5914
- }
5915
-
5916
- if (is2DConstraint(hoveredObject)) {
5917
- const constraintEntities = hoveredObject.members.entities.members.map(entity => entity.value);
5918
- set(state_ => {
5919
- const highlighted = state_.highlighted;
5920
- const highlightedConstraints = highlighted.filter(id => is2DConstraint(tree[id]) && id !== hoveredId);
5921
- return {
5922
- hovered: hoveredId,
5923
- highlighted: [...highlightedConstraints, hoveredId, ...constraintEntities]
5924
- };
5925
- });
5926
- } else {
5927
- const linkedConstraints = Object.values(tree).filter(obj => is2DConstraint(obj)).filter(obj => obj.members.entities.members.some(entity => entity.value === hoveredId)).map(obj => obj.id);
5928
- const constraintsToGeometry = {};
5929
- linkedConstraints.forEach(id => {
5930
- constraintsToGeometry[id] = hoveredId;
5931
- });
5932
- set(state_ => {
5933
- return {
5934
- hovered: hoveredId,
5935
- highlighted: [hoveredId, ...linkedConstraints],
5936
- constraintsToGeometry: _objectSpread$f(_objectSpread$f({}, state_.constraintsToGeometry), constraintsToGeometry)
5937
- };
5938
- });
5939
- }
5940
-
5941
- if (timerId) {
5942
- window.clearTimeout(timerId);
5943
- timerId = undefined;
5944
- }
5945
6158
  };
5946
6159
 
5947
6160
  const onPointerOut = e => {
5948
- const {
5949
- state,
5950
- set
5951
- } = getPlugin(drawingId, pluginId);
5952
6161
  const hoveredId = e.object.userData.objId;
5953
- const tree = getDrawing(drawingId).structure.tree;
5954
- const hoveredObject = tree[hoveredId];
5955
-
5956
- if (!hoveredObject || hoveredObject && hoveredObject.class === CCClasses.CCSketch || state.rubberBandRectangle) {
5957
- return;
5958
- }
5959
-
5960
- set(state_ => {
5961
- const highlighted = state_.highlighted;
5962
- const highlightedConstraints = highlighted.filter(id => is2DConstraint(tree[id]));
5963
- return {
5964
- hovered: state_.hovered === hoveredId ? UNDEFINEDID : state_.hovered,
5965
- highlighted: highlightedConstraints
5966
- };
5967
- });
5968
-
5969
- if (timerId) {
5970
- window.clearTimeout(timerId);
5971
- }
5972
-
5973
- timerId = window.setTimeout(() => {
5974
- set({
5975
- highlighted: []
5976
- });
5977
- }, 1000);
6162
+ unhover(drawingId, pluginId, hoveredId);
5978
6163
  e.stopPropagation();
5979
6164
  };
5980
6165
 
@@ -6073,9 +6258,9 @@ const snapDraggedPoints = (diff, drawingId) => {
6073
6258
  return snapResult;
6074
6259
  };
6075
6260
 
6076
- function ownKeys$e(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
6261
+ function ownKeys$f(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
6077
6262
 
6078
- function _objectSpread$e(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$e(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$e(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
6263
+ function _objectSpread$f(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$f(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$f(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
6079
6264
 
6080
6265
  const artifDelay = 16;
6081
6266
 
@@ -6262,22 +6447,8 @@ function Drag(drawingId, pluginId) {
6262
6447
  return;
6263
6448
  }
6264
6449
 
6265
- set(state => {
6266
- const curSelected = state.selected;
6267
-
6268
- if (curSelected.indexOf(pressedId) >= 0) {
6269
- const newSelected = curSelected.filter(id => id !== pressedId);
6270
- return {
6271
- selected: newSelected
6272
- };
6273
- } else {
6274
- curSelected.push(pressedId);
6275
- return {
6276
- selected: [...curSelected]
6277
- };
6278
- }
6279
- });
6280
- }
6450
+ select(drawingId, pluginId, pressedId);
6451
+ }
6281
6452
 
6282
6453
  clearIgnoreList();
6283
6454
  clearDraggedPoints();
@@ -6363,7 +6534,7 @@ function Drag(drawingId, pluginId) {
6363
6534
  name: HandlersList.DRAG,
6364
6535
  filter,
6365
6536
  onDestruct: destructor,
6366
- pointerHandlers: _objectSpread$e({
6537
+ pointerHandlers: _objectSpread$f({
6367
6538
  onPointerDown,
6368
6539
  onPointerUp,
6369
6540
  onPointerMove
@@ -6375,9 +6546,9 @@ function Drag(drawingId, pluginId) {
6375
6546
  };
6376
6547
  }
6377
6548
 
6378
- function ownKeys$d(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
6549
+ function ownKeys$e(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
6379
6550
 
6380
- function _objectSpread$d(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$d(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$d(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
6551
+ function _objectSpread$e(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$e(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$e(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
6381
6552
  function DrawPoint(drawingId, pluginId) {
6382
6553
  const {
6383
6554
  set
@@ -6446,8 +6617,8 @@ function DrawPoint(drawingId, pluginId) {
6446
6617
  set(state => {
6447
6618
  const tmpPoint = state.tmpObjects[tmpPointId];
6448
6619
  return {
6449
- tmpObjects: _objectSpread$d(_objectSpread$d({}, state.tmpObjects), {}, {
6450
- [tmpPointId]: _objectSpread$d(_objectSpread$d({}, tmpPoint), {}, {
6620
+ tmpObjects: _objectSpread$e(_objectSpread$e({}, state.tmpObjects), {}, {
6621
+ [tmpPointId]: _objectSpread$e(_objectSpread$e({}, tmpPoint), {}, {
6451
6622
  position: mousePos
6452
6623
  })
6453
6624
  })
@@ -6469,9 +6640,9 @@ function DrawPoint(drawingId, pluginId) {
6469
6640
  };
6470
6641
  }
6471
6642
 
6472
- function ownKeys$c(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
6643
+ function ownKeys$d(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
6473
6644
 
6474
- function _objectSpread$c(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$c(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$c(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
6645
+ function _objectSpread$d(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$d(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$d(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
6475
6646
  function DrawLine(drawingId, pluginId) {
6476
6647
  // Global hooks:
6477
6648
  const {
@@ -6557,7 +6728,7 @@ function DrawLine(drawingId, pluginId) {
6557
6728
  endPId: tmpEndP.id
6558
6729
  };
6559
6730
  return {
6560
- tmpObjects: _objectSpread$c(_objectSpread$c({}, state.tmpObjects), {}, {
6731
+ tmpObjects: _objectSpread$d(_objectSpread$d({}, state.tmpObjects), {}, {
6561
6732
  [tmpStartP.id]: tmpStartP,
6562
6733
  [tmpLine.id]: tmpLine
6563
6734
  })
@@ -6595,8 +6766,8 @@ function DrawLine(drawingId, pluginId) {
6595
6766
  const tmpStartP = state.tmpObjects[tmpStartPId];
6596
6767
  const tmpEndP = state.tmpObjects[tmpEndPId];
6597
6768
  return {
6598
- tmpObjects: _objectSpread$c(_objectSpread$c({}, state.tmpObjects), {}, {
6599
- [tmpStartPId]: _objectSpread$c(_objectSpread$c({}, tmpStartP), {}, {
6769
+ tmpObjects: _objectSpread$d(_objectSpread$d({}, state.tmpObjects), {}, {
6770
+ [tmpStartPId]: _objectSpread$d(_objectSpread$d({}, tmpStartP), {}, {
6600
6771
  position: tmpEndP.position.clone()
6601
6772
  })
6602
6773
  })
@@ -6618,8 +6789,8 @@ function DrawLine(drawingId, pluginId) {
6618
6789
  set(state => {
6619
6790
  const tmpEndP = state.tmpObjects[tmpEndPId];
6620
6791
  return {
6621
- tmpObjects: _objectSpread$c(_objectSpread$c({}, state.tmpObjects), {}, {
6622
- [tmpEndPId]: _objectSpread$c(_objectSpread$c({}, tmpEndP), {}, {
6792
+ tmpObjects: _objectSpread$d(_objectSpread$d({}, state.tmpObjects), {}, {
6793
+ [tmpEndPId]: _objectSpread$d(_objectSpread$d({}, tmpEndP), {}, {
6623
6794
  position: mousePos
6624
6795
  })
6625
6796
  })
@@ -6644,9 +6815,9 @@ function DrawLine(drawingId, pluginId) {
6644
6815
  };
6645
6816
  }
6646
6817
 
6647
- function ownKeys$b(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
6818
+ function ownKeys$c(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
6648
6819
 
6649
- function _objectSpread$b(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$b(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$b(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
6820
+ function _objectSpread$c(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$c(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$c(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
6650
6821
  function DrawRectangle(drawingId, pluginId) {
6651
6822
  // Global hooks:
6652
6823
  const {
@@ -6702,7 +6873,7 @@ function DrawRectangle(drawingId, pluginId) {
6702
6873
  set(state => {
6703
6874
  const tmpPoint11 = state.tmpObjects[tmpPoint11Id];
6704
6875
 
6705
- const tmpPoint00 = _objectSpread$b(_objectSpread$b({}, state.tmpObjects[tmpPoint00Id]), {}, {
6876
+ const tmpPoint00 = _objectSpread$c(_objectSpread$c({}, state.tmpObjects[tmpPoint00Id]), {}, {
6706
6877
  position: tmpPoint11.position.clone()
6707
6878
  });
6708
6879
 
@@ -6770,7 +6941,7 @@ function DrawRectangle(drawingId, pluginId) {
6770
6941
  endPId: tmpPoint11.id
6771
6942
  };
6772
6943
  return {
6773
- tmpObjects: _objectSpread$b(_objectSpread$b({}, state.tmpObjects), {}, {
6944
+ tmpObjects: _objectSpread$c(_objectSpread$c({}, state.tmpObjects), {}, {
6774
6945
  [tmpPoint00.id]: tmpPoint00,
6775
6946
  [tmpPoint01.id]: tmpPoint01,
6776
6947
  [tmpPoint10.id]: tmpPoint10,
@@ -6798,7 +6969,7 @@ function DrawRectangle(drawingId, pluginId) {
6798
6969
  const tmpPoint11 = state.tmpObjects[tmpPoint11Id];
6799
6970
  return {
6800
6971
  tmpObjects: {
6801
- [tmpPoint00Id]: _objectSpread$b(_objectSpread$b({}, tmpPoint00), {}, {
6972
+ [tmpPoint00Id]: _objectSpread$c(_objectSpread$c({}, tmpPoint00), {}, {
6802
6973
  position: tmpPoint11.position.clone()
6803
6974
  })
6804
6975
  }
@@ -6822,8 +6993,8 @@ function DrawRectangle(drawingId, pluginId) {
6822
6993
  if (additionIndex === 0) {
6823
6994
  const tmpPoint00 = state.tmpObjects[tmpPoint00Id];
6824
6995
  return {
6825
- tmpObjects: _objectSpread$b(_objectSpread$b({}, state.tmpObjects), {}, {
6826
- [tmpPoint00Id]: _objectSpread$b(_objectSpread$b({}, tmpPoint00), {}, {
6996
+ tmpObjects: _objectSpread$c(_objectSpread$c({}, state.tmpObjects), {}, {
6997
+ [tmpPoint00Id]: _objectSpread$c(_objectSpread$c({}, tmpPoint00), {}, {
6827
6998
  position: snappedPos
6828
6999
  })
6829
7000
  })
@@ -6834,14 +7005,14 @@ function DrawRectangle(drawingId, pluginId) {
6834
7005
  const tmpPoint10 = state.tmpObjects[tmpPoint10Id];
6835
7006
  const tmpPoint11 = state.tmpObjects[tmpPoint11Id];
6836
7007
  return {
6837
- tmpObjects: _objectSpread$b(_objectSpread$b({}, state.tmpObjects), {}, {
6838
- [tmpPoint01Id]: _objectSpread$b(_objectSpread$b({}, tmpPoint01), {}, {
7008
+ tmpObjects: _objectSpread$c(_objectSpread$c({}, state.tmpObjects), {}, {
7009
+ [tmpPoint01Id]: _objectSpread$c(_objectSpread$c({}, tmpPoint01), {}, {
6839
7010
  position: new THREE.Vector3(startPos.x, snappedPos.y, startPos.z)
6840
7011
  }),
6841
- [tmpPoint10Id]: _objectSpread$b(_objectSpread$b({}, tmpPoint10), {}, {
7012
+ [tmpPoint10Id]: _objectSpread$c(_objectSpread$c({}, tmpPoint10), {}, {
6842
7013
  position: new THREE.Vector3(snappedPos.x, startPos.y, startPos.z)
6843
7014
  }),
6844
- [tmpPoint11Id]: _objectSpread$b(_objectSpread$b({}, tmpPoint11), {}, {
7015
+ [tmpPoint11Id]: _objectSpread$c(_objectSpread$c({}, tmpPoint11), {}, {
6845
7016
  position: new THREE.Vector3(snappedPos.x, snappedPos.y, startPos.z)
6846
7017
  })
6847
7018
  })
@@ -6867,17 +7038,35 @@ function DrawRectangle(drawingId, pluginId) {
6867
7038
  };
6868
7039
  }
6869
7040
 
7041
+ let scale = 1;
7042
+ function setScale(newScale) {
7043
+ scale = newScale;
7044
+ }
7045
+ function getScale() {
7046
+ return scale;
7047
+ } // The hook sets scale vector to a refered object in useFrame
7048
+
7049
+ function useScale(getVector) {
7050
+ const ref = React__default.useRef();
7051
+ useFrame(args => {
7052
+ if (ref.current) {
7053
+ const newScale = getVector ? getVector(scale) : [scale, scale, scale];
7054
+ ref.current.scale.set(...newScale);
7055
+ }
7056
+ });
7057
+ return ref;
7058
+ }
7059
+
6870
7060
  const lineWidth = 0.2;
6871
7061
  const pointSize = 0.5;
6872
7062
  const arcWidth = 0.2;
6873
7063
  const radSegments = 32;
6874
- const tubeSegments = 6;
6875
- const cylGeom = new THREE.CylinderGeometry(1, 1, 1, 6);
6876
- const Line = ({
7064
+ const tubeSegments$1 = 6;
7065
+ const cylGeom$1 = new THREE.CylinderGeometry(1, 1, 1, 6);
7066
+ const Line$1 = ({
6877
7067
  start,
6878
7068
  end,
6879
7069
  width = lineWidth,
6880
- scale = 1,
6881
7070
  materialProps,
6882
7071
  meshProps
6883
7072
  }) => {
@@ -6891,24 +7080,26 @@ const Line = ({
6891
7080
  quaternion: new THREE.Quaternion().setFromUnitVectors(new THREE.Vector3(0, 1, 0), dir)
6892
7081
  };
6893
7082
  }, [start, end]);
7083
+ const ref = useScale(scale => [width * scale, start.distanceTo(end), width * scale]);
6894
7084
  return /*#__PURE__*/React__default.createElement("mesh", _extends({}, meshProps, {
7085
+ ref: ref,
6895
7086
  position: position,
6896
7087
  quaternion: quaternion,
6897
- geometry: cylGeom,
6898
- scale: [width * scale, start.distanceTo(end), width * scale]
7088
+ geometry: cylGeom$1
6899
7089
  }), /*#__PURE__*/React__default.createElement("meshBasicMaterial", materialProps));
6900
7090
  };
6901
- const Point = ({
7091
+ const Point$1 = ({
6902
7092
  position,
6903
7093
  size = pointSize,
6904
- scale = 1,
6905
7094
  materialProps,
6906
7095
  meshProps
6907
7096
  }) => {
7097
+ const ref = useScale(scale => [size * scale, size * scale, size * scale]);
6908
7098
  return /*#__PURE__*/React__default.createElement("mesh", _extends({}, meshProps, {
6909
- position: position
7099
+ position: position,
7100
+ ref: ref
6910
7101
  }), /*#__PURE__*/React__default.createElement("sphereGeometry", {
6911
- args: [size * scale, tubeSegments, tubeSegments]
7102
+ args: [1, tubeSegments$1, tubeSegments$1]
6912
7103
  }), /*#__PURE__*/React__default.createElement("meshBasicMaterial", materialProps));
6913
7104
  };
6914
7105
  function getArcAngles(params) {
@@ -6968,7 +7159,7 @@ const Arc = ({
6968
7159
  position: center,
6969
7160
  quaternion: quaternion
6970
7161
  }), /*#__PURE__*/React__default.createElement("torusGeometry", {
6971
- args: [radius, width * scale, tubeSegments, radSegments, thetaLength]
7162
+ args: [radius, width * scale, tubeSegments$1, radSegments, thetaLength]
6972
7163
  }), /*#__PURE__*/React__default.createElement("meshBasicMaterial", _extends({}, materialProps, {
6973
7164
  side: clockwise ? THREE.DoubleSide : THREE.FrontSide
6974
7165
  })));
@@ -6984,13 +7175,13 @@ const Circle = ({
6984
7175
  return /*#__PURE__*/React__default.createElement("mesh", _extends({}, meshProps, {
6985
7176
  position: center
6986
7177
  }), /*#__PURE__*/React__default.createElement("torusGeometry", {
6987
- args: [radius, width * scale, tubeSegments, radSegments]
7178
+ args: [radius, width * scale, tubeSegments$1, radSegments]
6988
7179
  }), /*#__PURE__*/React__default.createElement("meshBasicMaterial", materialProps));
6989
7180
  };
6990
7181
 
6991
- function ownKeys$a(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
7182
+ function ownKeys$b(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
6992
7183
 
6993
- function _objectSpread$a(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$a(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$a(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
7184
+ function _objectSpread$b(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$b(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$b(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
6994
7185
  function DrawArc(drawingId, pluginId, arcType) {
6995
7186
  // Global hooks:
6996
7187
  const {
@@ -7046,7 +7237,7 @@ function DrawArc(drawingId, pluginId, arcType) {
7046
7237
  additionIndex = 0;
7047
7238
  lastAddedEndPointId = UNDEFINEDID;
7048
7239
  set(state => {
7049
- const tmpStartP = _objectSpread$a(_objectSpread$a({}, state.tmpObjects[tmpStartPId]), {}, {
7240
+ const tmpStartP = _objectSpread$b(_objectSpread$b({}, state.tmpObjects[tmpStartPId]), {}, {
7050
7241
  position: lastMousePos.clone()
7051
7242
  });
7052
7243
 
@@ -7061,24 +7252,24 @@ function DrawArc(drawingId, pluginId, arcType) {
7061
7252
  set(state => {
7062
7253
  const tmpStartP = state.tmpObjects[tmpStartPId];
7063
7254
 
7064
- const tmpEndP = _objectSpread$a(_objectSpread$a({}, state.tmpObjects[tmpEndPId]), {}, {
7255
+ const tmpEndP = _objectSpread$b(_objectSpread$b({}, state.tmpObjects[tmpEndPId]), {}, {
7065
7256
  position: lastMousePos.clone()
7066
7257
  });
7067
7258
 
7068
7259
  const centerPos = calculateCenterPoint(tmpStartP.position, lastMousePos, lastMousePos);
7069
7260
 
7070
- const tmpCenterP = _objectSpread$a(_objectSpread$a({}, state.tmpObjects[tmpCenterPId]), {}, {
7261
+ const tmpCenterP = _objectSpread$b(_objectSpread$b({}, state.tmpObjects[tmpCenterPId]), {}, {
7071
7262
  position: centerPos ? centerPos : lastMousePos.clone()
7072
7263
  });
7073
7264
 
7074
- const tmpArc = _objectSpread$a(_objectSpread$a({}, state.tmpObjects[tmpArcId]), {}, {
7265
+ const tmpArc = _objectSpread$b(_objectSpread$b({}, state.tmpObjects[tmpArcId]), {}, {
7075
7266
  // In case centerPos couldn't be calculated, the arc should be drawn as a line
7076
7267
  drawAsLine: centerPos === undefined,
7077
7268
  clockwise: false
7078
7269
  });
7079
7270
 
7080
7271
  return {
7081
- tmpObjects: _objectSpread$a(_objectSpread$a({}, state.tmpObjects), {}, {
7272
+ tmpObjects: _objectSpread$b(_objectSpread$b({}, state.tmpObjects), {}, {
7082
7273
  [tmpEndP.id]: tmpEndP,
7083
7274
  [tmpCenterP.id]: tmpCenterP,
7084
7275
  [tmpArc.id]: tmpArc
@@ -7199,7 +7390,7 @@ function DrawArc(drawingId, pluginId, arcType) {
7199
7390
  clockwise: false
7200
7391
  };
7201
7392
  return {
7202
- tmpObjects: _objectSpread$a(_objectSpread$a({}, state.tmpObjects), {}, {
7393
+ tmpObjects: _objectSpread$b(_objectSpread$b({}, state.tmpObjects), {}, {
7203
7394
  [tmpEndP.id]: tmpEndP,
7204
7395
  [tmpCenterP.id]: tmpCenterP,
7205
7396
  [tmpArc.id]: tmpArc
@@ -7228,7 +7419,7 @@ function DrawArc(drawingId, pluginId, arcType) {
7228
7419
  clockwise: false
7229
7420
  };
7230
7421
  return {
7231
- tmpObjects: _objectSpread$a(_objectSpread$a({}, state.tmpObjects), {}, {
7422
+ tmpObjects: _objectSpread$b(_objectSpread$b({}, state.tmpObjects), {}, {
7232
7423
  [tmpCenterP.id]: tmpCenterP,
7233
7424
  [tmpArc.id]: tmpArc
7234
7425
  })
@@ -7286,11 +7477,11 @@ function DrawArc(drawingId, pluginId, arcType) {
7286
7477
  const tmpEndP = state.tmpObjects[tmpEndPId];
7287
7478
  const tmpCenterP = state.tmpObjects[tmpCenterPId];
7288
7479
  return {
7289
- tmpObjects: _objectSpread$a(_objectSpread$a({}, state.tmpObjects), {}, {
7290
- [tmpStartPId]: _objectSpread$a(_objectSpread$a({}, tmpStartP), {}, {
7480
+ tmpObjects: _objectSpread$b(_objectSpread$b({}, state.tmpObjects), {}, {
7481
+ [tmpStartPId]: _objectSpread$b(_objectSpread$b({}, tmpStartP), {}, {
7291
7482
  position: tmpEndP.position.clone()
7292
7483
  }),
7293
- [tmpCenterPId]: _objectSpread$a(_objectSpread$a({}, tmpCenterP), {}, {
7484
+ [tmpCenterPId]: _objectSpread$b(_objectSpread$b({}, tmpCenterP), {}, {
7294
7485
  position: tmpEndP.position.clone()
7295
7486
  })
7296
7487
  })
@@ -7314,8 +7505,8 @@ function DrawArc(drawingId, pluginId, arcType) {
7314
7505
  if (additionIndex === 0) {
7315
7506
  const tmpStartP = state.tmpObjects[tmpStartPId];
7316
7507
  return {
7317
- tmpObjects: _objectSpread$a(_objectSpread$a({}, state.tmpObjects), {}, {
7318
- [tmpStartPId]: _objectSpread$a(_objectSpread$a({}, tmpStartP), {}, {
7508
+ tmpObjects: _objectSpread$b(_objectSpread$b({}, state.tmpObjects), {}, {
7509
+ [tmpStartPId]: _objectSpread$b(_objectSpread$b({}, tmpStartP), {}, {
7319
7510
  position: lastMousePos.clone()
7320
7511
  })
7321
7512
  })
@@ -7327,14 +7518,14 @@ function DrawArc(drawingId, pluginId, arcType) {
7327
7518
  const tmpCenterP = state.tmpObjects[tmpCenterPId];
7328
7519
  const centerPos = calculateCenterPoint(tmpStartP.position, lastMousePos, lastMousePos);
7329
7520
  return {
7330
- tmpObjects: _objectSpread$a(_objectSpread$a({}, state.tmpObjects), {}, {
7331
- [tmpEndPId]: _objectSpread$a(_objectSpread$a({}, tmpEndP), {}, {
7521
+ tmpObjects: _objectSpread$b(_objectSpread$b({}, state.tmpObjects), {}, {
7522
+ [tmpEndPId]: _objectSpread$b(_objectSpread$b({}, tmpEndP), {}, {
7332
7523
  position: lastMousePos.clone()
7333
7524
  }),
7334
- [tmpCenterPId]: _objectSpread$a(_objectSpread$a({}, tmpCenterP), {}, {
7525
+ [tmpCenterPId]: _objectSpread$b(_objectSpread$b({}, tmpCenterP), {}, {
7335
7526
  position: centerPos ? centerPos : lastMousePos.clone()
7336
7527
  }),
7337
- [tmpArcId]: _objectSpread$a(_objectSpread$a({}, tmpArc), {}, {
7528
+ [tmpArcId]: _objectSpread$b(_objectSpread$b({}, tmpArc), {}, {
7338
7529
  // In case centerPos couldn't be calculated, the arc should be drawn as a line
7339
7530
  drawAsLine: centerPos === undefined,
7340
7531
  clockwise: false
@@ -7348,14 +7539,14 @@ function DrawArc(drawingId, pluginId, arcType) {
7348
7539
  const tmpCenterP = state.tmpObjects[tmpCenterPId];
7349
7540
  const centerPos = calculateCenterPoint(tmpStartP.position, tmpEndP.position, lastMousePos);
7350
7541
  return {
7351
- tmpObjects: _objectSpread$a(_objectSpread$a({}, state.tmpObjects), {}, {
7352
- [tmpEndPId]: _objectSpread$a(_objectSpread$a({}, tmpEndP), {}, {
7542
+ tmpObjects: _objectSpread$b(_objectSpread$b({}, state.tmpObjects), {}, {
7543
+ [tmpEndPId]: _objectSpread$b(_objectSpread$b({}, tmpEndP), {}, {
7353
7544
  position: arcType === HandlersList.DRAWARCTANGENT ? lastMousePos.clone() : tmpEndP.position
7354
7545
  }),
7355
- [tmpCenterPId]: _objectSpread$a(_objectSpread$a({}, tmpCenterP), {}, {
7546
+ [tmpCenterPId]: _objectSpread$b(_objectSpread$b({}, tmpCenterP), {}, {
7356
7547
  position: centerPos ? centerPos : lastMousePos.clone()
7357
7548
  }),
7358
- [tmpArcId]: _objectSpread$a(_objectSpread$a({}, tmpArc), {}, {
7549
+ [tmpArcId]: _objectSpread$b(_objectSpread$b({}, tmpArc), {}, {
7359
7550
  // In case centerPos couldn't be calculated, the arc should be drawn as a line
7360
7551
  drawAsLine: centerPos === undefined,
7361
7552
  clockwise: evaluateClockwise(tmpStartP.position, tmpEndP.position, lastMousePos)
@@ -7383,9 +7574,9 @@ function DrawArc(drawingId, pluginId, arcType) {
7383
7574
  };
7384
7575
  }
7385
7576
 
7386
- function ownKeys$9(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
7577
+ function ownKeys$a(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
7387
7578
 
7388
- function _objectSpread$9(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$9(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$9(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
7579
+ function _objectSpread$a(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$a(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$a(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
7389
7580
  function DrawCircle(drawingId, pluginId) {
7390
7581
  const {
7391
7582
  set
@@ -7432,7 +7623,7 @@ function DrawCircle(drawingId, pluginId) {
7432
7623
  } else {
7433
7624
  additionIndex = 0;
7434
7625
  set(state => {
7435
- const tmpCenterP = _objectSpread$9(_objectSpread$9({}, state.tmpObjects[tmpCenterPId]), {}, {
7626
+ const tmpCenterP = _objectSpread$a(_objectSpread$a({}, state.tmpObjects[tmpCenterPId]), {}, {
7436
7627
  position: lastMousePos.clone()
7437
7628
  });
7438
7629
 
@@ -7466,7 +7657,7 @@ function DrawCircle(drawingId, pluginId) {
7466
7657
  radius: 0.001
7467
7658
  };
7468
7659
  return {
7469
- tmpObjects: _objectSpread$9(_objectSpread$9({}, state.tmpObjects), {}, {
7660
+ tmpObjects: _objectSpread$a(_objectSpread$a({}, state.tmpObjects), {}, {
7470
7661
  [tmpCenterP.id]: tmpCenterP,
7471
7662
  [tmpCircle.id]: tmpCircle
7472
7663
  })
@@ -7487,7 +7678,7 @@ function DrawCircle(drawingId, pluginId) {
7487
7678
  const tmpCenterP = state.tmpObjects[tmpCenterPId];
7488
7679
  return {
7489
7680
  tmpObjects: {
7490
- [tmpCenterPId]: _objectSpread$9(_objectSpread$9({}, tmpCenterP), {}, {
7681
+ [tmpCenterPId]: _objectSpread$a(_objectSpread$a({}, tmpCenterP), {}, {
7491
7682
  position: e.point.clone().applyMatrix4(getGlobalToLocalMatrix(drawingId, sketchId))
7492
7683
  })
7493
7684
  }
@@ -7511,8 +7702,8 @@ function DrawCircle(drawingId, pluginId) {
7511
7702
  if (additionIndex === 0) {
7512
7703
  const tmpCenterP = state.tmpObjects[tmpCenterPId];
7513
7704
  return {
7514
- tmpObjects: _objectSpread$9(_objectSpread$9({}, state.tmpObjects), {}, {
7515
- [tmpCenterPId]: _objectSpread$9(_objectSpread$9({}, tmpCenterP), {}, {
7705
+ tmpObjects: _objectSpread$a(_objectSpread$a({}, state.tmpObjects), {}, {
7706
+ [tmpCenterPId]: _objectSpread$a(_objectSpread$a({}, tmpCenterP), {}, {
7516
7707
  position: snappedPos || localPos
7517
7708
  })
7518
7709
  })
@@ -7521,8 +7712,8 @@ function DrawCircle(drawingId, pluginId) {
7521
7712
  const tmpCenterP = state.tmpObjects[tmpCenterPId];
7522
7713
  const tmpCircle = state.tmpObjects[tmpCircleId];
7523
7714
  return {
7524
- tmpObjects: _objectSpread$9(_objectSpread$9({}, state.tmpObjects), {}, {
7525
- [tmpCircleId]: _objectSpread$9(_objectSpread$9({}, tmpCircle), {}, {
7715
+ tmpObjects: _objectSpread$a(_objectSpread$a({}, state.tmpObjects), {}, {
7716
+ [tmpCircleId]: _objectSpread$a(_objectSpread$a({}, tmpCircle), {}, {
7526
7717
  radius: Math.max(tmpCenterP.position.distanceTo(localPos), 0.001)
7527
7718
  })
7528
7719
  })
@@ -8020,9 +8211,9 @@ function recognizeFilletByArc(object, tree, sketchId) {
8020
8211
  };
8021
8212
  }
8022
8213
 
8023
- function ownKeys$8(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
8214
+ function ownKeys$9(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
8024
8215
 
8025
- function _objectSpread$8(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$8(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$8(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
8216
+ function _objectSpread$9(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$9(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$9(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
8026
8217
  function Fillet(drawingId, pluginId) {
8027
8218
  const actions = getDrawing(drawingId).api;
8028
8219
  const plugin = getPlugin(drawingId, pluginId);
@@ -8171,7 +8362,7 @@ function Fillet(drawingId, pluginId) {
8171
8362
  return;
8172
8363
  }
8173
8364
 
8174
- ccAPI.sketcher.createFillet(drawingId, sketchId, data.info.lines.map(line => line.id), data.info.lineStarts.map(lineStart => lineStart.id), data.info.incidence, data.info.control, data.params.start, getArcAngles(_objectSpread$8(_objectSpread$8({}, data.params), {}, {
8365
+ ccAPI.sketcher.createFillet(drawingId, sketchId, data.info.lines.map(line => line.id), data.info.lineStarts.map(lineStart => lineStart.id), data.info.incidence, data.info.control, data.params.start, getArcAngles(_objectSpread$9(_objectSpread$9({}, data.params), {}, {
8175
8366
  radius: 1
8176
8367
  })).mid, data.params.end);
8177
8368
  set({
@@ -8267,6 +8458,32 @@ function Trim(drawingId, pluginId) {
8267
8458
  };
8268
8459
  }
8269
8460
 
8461
+ function UseRef(drawingId, pluginId) {
8462
+ // UseRef shouldn't work with any of sketch objects
8463
+ const filter = object => false;
8464
+
8465
+ const filterSel = (scope, data) => lineSegmentsFilter(scope, data) || loopFilter(scope, data) || pointFilter(scope, data);
8466
+
8467
+ let remove = undefined;
8468
+
8469
+ const constructor = () => {
8470
+ const selApi = getDrawing(drawingId).api.selection;
8471
+ remove = selApi.createSelector('UseRef', filterSel, true);
8472
+ };
8473
+
8474
+ const destructor = () => {
8475
+ remove && remove();
8476
+ };
8477
+
8478
+ return {
8479
+ name: HandlersList.USEREF,
8480
+ filter,
8481
+ onConstruct: constructor,
8482
+ onDestruct: destructor,
8483
+ pointerHandlers: {}
8484
+ };
8485
+ }
8486
+
8270
8487
  const Handlers$1 = {
8271
8488
  [HandlersList.CREATEANGLE]: CreateAngle,
8272
8489
  [HandlersList.DRAG]: Drag,
@@ -8276,6 +8493,7 @@ const Handlers$1 = {
8276
8493
  [HandlersList.DRAWRECTANGLE]: DrawRectangle,
8277
8494
  [HandlersList.FILLET]: Fillet,
8278
8495
  [HandlersList.TRIM]: Trim,
8496
+ [HandlersList.USEREF]: UseRef,
8279
8497
  [HandlersList.DRAWARCCENTER]: (drawingId, pluginId) => DrawArc(drawingId, pluginId, HandlersList.DRAWARCCENTER),
8280
8498
  [HandlersList.DRAWARCMIDDLE]: (drawingId, pluginId) => DrawArc(drawingId, pluginId, HandlersList.DRAWARCMIDDLE),
8281
8499
  [HandlersList.DRAWARCTANGENT]: (drawingId, pluginId) => DrawArc(drawingId, pluginId, HandlersList.DRAWARCTANGENT)
@@ -8736,10 +8954,10 @@ const resources = {
8736
8954
  [HandlersList.DRAWCIRCLE]: img$y,
8737
8955
  [HandlersList.FILLET]: img$x,
8738
8956
  [HandlersList.TRIM]: img$w,
8957
+ [HandlersList.USEREF]: img$s,
8739
8958
  [Patterns.RECTANGULAR]: img$v,
8740
8959
  [Patterns.CIRCULAR]: img$u,
8741
- [Patterns.MIRROR]: img$t,
8742
- ['useRef']: img$s
8960
+ [Patterns.MIRROR]: img$t
8743
8961
  };
8744
8962
  const textures = {};
8745
8963
  const textureLoader = new THREE.TextureLoader();
@@ -8827,11 +9045,14 @@ const useGeomParams = objId => {
8827
9045
 
8828
9046
  if (isHovered || isSelected || isHighlighted) {
8829
9047
  renderOrder_ += 1;
8830
- }
9048
+ } // TODO: returning isHovered and isSelected is a workaround for changing scale of the hovered point. (return scale coef instead?)
9049
+
8831
9050
 
8832
9051
  return {
8833
9052
  renderOrder: renderOrder_,
8834
- polygonOffsetUnits: offsetUnits
9053
+ polygonOffsetUnits: offsetUnits,
9054
+ isHovered,
9055
+ isSelected
8835
9056
  };
8836
9057
  };
8837
9058
 
@@ -8986,6 +9207,17 @@ const useUserData = objId => {
8986
9207
  return React__default.useMemo(() => ({
8987
9208
  objId
8988
9209
  }), [objId]);
9210
+ }; // Fix for interaction until drei support undefined as pointer handlers
9211
+
9212
+ const defaultHandlers = {
9213
+ onPointerOver: () => null,
9214
+ // onPointerEnter: () => null,
9215
+ onPointerDown: () => null,
9216
+ onPointerMove: () => null,
9217
+ onPointerUp: () => null,
9218
+ onPointerCancel: () => null,
9219
+ onPointerOut: () => null // onPointerLeave: () => null,
9220
+
8989
9221
  };
8990
9222
  const useHandlersAndColor = (drawingId, objId) => {
8991
9223
  const activeSelection = useDrawing(drawingId, d => d.selection.active);
@@ -8994,7 +9226,7 @@ const useHandlersAndColor = (drawingId, objId) => {
8994
9226
  const handlers = activeSelection ? globalSelection.handlers : sketchHandlers;
8995
9227
  const color = useColor(objId, globalSelection.isHovered);
8996
9228
  return React__default.useMemo(() => ({
8997
- handlers,
9229
+ handlers: handlers || defaultHandlers,
8998
9230
  color
8999
9231
  }), [handlers, color]);
9000
9232
  };
@@ -9210,9 +9442,190 @@ class InfinityPlane extends THREE.Object3D {
9210
9442
 
9211
9443
  }
9212
9444
 
9213
- function ownKeys$7(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
9445
+ // InstancedMesh from three.js use the single mesh but applies different transformations to different instances of the mesh
9446
+ // which allows to render multiple objects in the same render call, so we have separate render call for each mesh
9447
+ // (in our case there're 2 render calls: one for Boxes and another for Spheres).
9214
9448
 
9215
- function _objectSpread$7(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$7(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$7(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
9449
+ const material = new THREE.MeshBasicMaterial();
9450
+ const tubeSegments = 6;
9451
+ const cylGeom = new THREE.CylinderGeometry(1, 1, 1, tubeSegments);
9452
+ const cylMesh = new THREE.Mesh(cylGeom, material);
9453
+ const widthSegments = 12;
9454
+ const heightSegments = 12;
9455
+ const sphereGeom = new THREE.SphereGeometry(1, widthSegments, heightSegments);
9456
+ const sphereMesh = new THREE.Mesh(sphereGeom, material); // We use context to store "mocked" objects.
9457
+
9458
+ const MeshContext = /*#__PURE__*/React__default.createContext({
9459
+ Cylinder: null,
9460
+ Sphere: null
9461
+ });
9462
+
9463
+ const ContextWrapper = ({
9464
+ cylinder,
9465
+ sphere,
9466
+ children
9467
+ }) => {
9468
+ const contextVal = React__default.useMemo(() => {
9469
+ return {
9470
+ Cylinder: cylinder,
9471
+ Sphere: sphere
9472
+ };
9473
+ }, [cylinder, sphere]);
9474
+ return /*#__PURE__*/React__default.createElement(MeshContext.Provider, {
9475
+ value: contextVal
9476
+ }, children);
9477
+ };
9478
+ /**
9479
+ * Component which implements InstancedMesh from three.js.
9480
+ * Merged component from drei takes globaly created meshes and then passes corresponding "mocked" components via function props (Box and Sphere) to children.
9481
+ * "mocked" components are used for saying drei where to draw instances.
9482
+ */
9483
+
9484
+
9485
+ const MergedWrapper = ({
9486
+ children
9487
+ }) => {
9488
+ return (
9489
+ /*#__PURE__*/
9490
+ // Default raycast of merged should be turned off, because custom raycast is used in primitivesMerged
9491
+ React__default.createElement(Merged, {
9492
+ meshes: [cylMesh, sphereMesh],
9493
+ limit: 10000,
9494
+ raycast: null
9495
+ }, (Cylinder, Sphere) => /*#__PURE__*/React__default.createElement(ContextWrapper, {
9496
+ cylinder: Cylinder,
9497
+ sphere: Sphere
9498
+ }, children))
9499
+ );
9500
+ };
9501
+
9502
+ const lineStart = new THREE.Vector3();
9503
+ const lineEnd = new THREE.Vector3();
9504
+ const pointOnRay = new THREE.Vector3();
9505
+ const lineCoef = 1.2;
9506
+
9507
+ function getParentSketch(child) {
9508
+ const parent = child.parent;
9509
+ if (!parent) return null;
9510
+ if (parent.name === 'sketch') return parent;
9511
+ return getParentSketch(parent);
9512
+ }
9513
+
9514
+ const Line = ({
9515
+ start,
9516
+ end,
9517
+ width = lineWidth,
9518
+ materialProps,
9519
+ meshProps,
9520
+ notInteractive,
9521
+ scalePlus
9522
+ }) => {
9523
+ const {
9524
+ position,
9525
+ quaternion
9526
+ } = React__default.useMemo(() => {
9527
+ const dir = end.clone().sub(start).normalize();
9528
+ return {
9529
+ position: new THREE.Vector3().lerpVectors(start, end, 0.5),
9530
+ quaternion: new THREE.Quaternion().setFromUnitVectors(new THREE.Vector3(0, 1, 0), dir)
9531
+ };
9532
+ }, [start, end]); // TODO: make lineRaycast global function
9533
+
9534
+ const lineRaycast = React__default.useCallback(function (raycaster, intersects) {
9535
+ const sketchGroup = getParentSketch(this);
9536
+
9537
+ if (sketchGroup === null || (sketchGroup == null ? void 0 : sketchGroup.name) !== 'sketch') {
9538
+ console.warn('Line is not a child of sketch group');
9539
+ return;
9540
+ }
9541
+
9542
+ lineStart.copy(start);
9543
+ lineEnd.copy(end);
9544
+ lineStart.applyMatrix4(sketchGroup.matrixWorld);
9545
+ lineEnd.applyMatrix4(sketchGroup.matrixWorld);
9546
+ const dist = Math.sqrt(raycaster.ray.distanceSqToSegment(lineStart, lineEnd, pointOnRay));
9547
+ const sketchScale = getScale();
9548
+
9549
+ if (dist < lineCoef * sketchScale) {
9550
+ intersects.push({
9551
+ distance: dist,
9552
+ point: pointOnRay,
9553
+ face: null,
9554
+ object: this
9555
+ });
9556
+ }
9557
+ }, [start, end]);
9558
+ const {
9559
+ Cylinder
9560
+ } = React__default.useContext(MeshContext);
9561
+ const ref = useScale(scale => {
9562
+ const scale_ = scalePlus ? scale + 0.01 : scale;
9563
+ return [width * scale_, start.distanceTo(end), width * scale_];
9564
+ }); // We need initial scale to remove flickering of recently created objects
9565
+
9566
+ const initialScale = React__default.useMemo(() => {
9567
+ const scale = getScale();
9568
+ return [width * scale, start.distanceTo(end), width * scale]; // eslint-disable-next-line react-hooks/exhaustive-deps
9569
+ }, []);
9570
+ return /*#__PURE__*/React__default.createElement(Cylinder, _extends({
9571
+ ref: ref,
9572
+ scale: initialScale
9573
+ }, materialProps, meshProps, {
9574
+ position: position,
9575
+ quaternion: quaternion,
9576
+ raycast: notInteractive ? null : lineRaycast
9577
+ }));
9578
+ };
9579
+
9580
+ const pointPos = new THREE.Vector3();
9581
+ const pointCoef = 1.3; // Coefficient for increased interaction area
9582
+
9583
+ function pointRaycast(raycaster, intersects) {
9584
+ this.getWorldPosition(pointPos);
9585
+ const dist = raycaster.ray.distanceToPoint(pointPos);
9586
+ const sketchScale = getScale();
9587
+
9588
+ if (dist < pointCoef * sketchScale) {
9589
+ intersects.push({
9590
+ distance: dist,
9591
+ point: pointPos.clone(),
9592
+ face: null,
9593
+ object: this
9594
+ });
9595
+ }
9596
+ }
9597
+
9598
+ const Point = ({
9599
+ position,
9600
+ size = pointSize,
9601
+ materialProps,
9602
+ meshProps,
9603
+ scalePlus
9604
+ }) => {
9605
+ const {
9606
+ Sphere
9607
+ } = React__default.useContext(MeshContext);
9608
+ const ref = useScale(scale => {
9609
+ const scale_ = scalePlus ? scale + 0.01 : scale;
9610
+ return [size * scale_, size * scale_, size * scale_];
9611
+ }); // We need initial scale to remove flickering of recently created objects
9612
+
9613
+ const initialScale = React__default.useMemo(() => {
9614
+ const scale = getScale();
9615
+ return [size * scale, size * scale, size * scale]; // eslint-disable-next-line react-hooks/exhaustive-deps
9616
+ }, []);
9617
+ return /*#__PURE__*/React__default.createElement(Sphere, _extends({
9618
+ scale: initialScale
9619
+ }, materialProps, meshProps, {
9620
+ position: position,
9621
+ ref: ref,
9622
+ raycast: pointRaycast
9623
+ }));
9624
+ };
9625
+
9626
+ function ownKeys$8(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
9627
+
9628
+ function _objectSpread$8(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$8(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$8(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
9216
9629
  /*
9217
9630
  * !polygonOffset!
9218
9631
  * For correct drawing of objects that lie in the same plane, polygonOffset is used.
@@ -9220,9 +9633,9 @@ function _objectSpread$7(target) { for (var i = 1; i < arguments.length; i++) {
9220
9633
  * offset = factor * DZ + r * units
9221
9634
  * Where DZ is a measurement of the change in depth relative to the screen area of the polygon,
9222
9635
  * and r is an implementation-specific value to create a constant depth offset.
9223
- .
9224
9636
  * The offset is added before the depth test is performed and before the value is written into the depth buffer.
9225
- * factor parameter is redundant for this purpose, so only units parameter is used.
9637
+ *
9638
+ * Factor parameter is redundant for this purpose, so only units parameter is used.
9226
9639
  */
9227
9640
 
9228
9641
  extend({
@@ -9232,8 +9645,7 @@ const hoverZone = 0.6;
9232
9645
 
9233
9646
  const CCLine = props => {
9234
9647
  const {
9235
- drawingId,
9236
- pluginId
9648
+ drawingId
9237
9649
  } = React__default.useContext(ViewContext);
9238
9650
  const {
9239
9651
  objId
@@ -9242,8 +9654,7 @@ const CCLine = props => {
9242
9654
  const {
9243
9655
  handlers,
9244
9656
  color
9245
- } = useHandlersAndColor(drawingId, objId);
9246
- const scale = useSketchState(drawingId, pluginId, state => state.scale); // TODO: put useUserData into useHandlersAndColor ?
9657
+ } = useHandlersAndColor(drawingId, objId); // TODO: put useUserData into useHandlersAndColor ?
9247
9658
 
9248
9659
  const userData = useUserData(objId);
9249
9660
  const point1 = useDrawing(drawingId, drawing => drawing.structure.tree[line.children[0]]);
@@ -9252,34 +9663,24 @@ const CCLine = props => {
9252
9663
  const end = convertToVector(point2.members.pos);
9253
9664
  const {
9254
9665
  renderOrder,
9255
- polygonOffsetUnits
9666
+ polygonOffsetUnits,
9667
+ isHovered,
9668
+ isSelected
9256
9669
  } = useGeomParams(objId);
9257
9670
  return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Line, {
9258
9671
  start: start,
9259
9672
  end: end,
9260
- scale: scale,
9261
- meshProps: {
9262
- renderOrder
9263
- },
9264
- materialProps: {
9265
- side: THREE.DoubleSide,
9266
- polygonOffset: true,
9267
- polygonOffsetUnits: polygonOffsetUnits,
9268
- color
9269
- }
9270
- }), /*#__PURE__*/React__default.createElement(Line, {
9271
- start: start,
9272
- end: end,
9273
- scale: scale,
9274
- width: lineWidth + hoverZone,
9275
- meshProps: _objectSpread$7(_objectSpread$7({
9673
+ scalePlus: isHovered || isSelected,
9674
+ meshProps: _objectSpread$8(_objectSpread$8({
9276
9675
  renderOrder
9277
9676
  }, handlers), {}, {
9278
9677
  userData
9279
9678
  }),
9280
9679
  materialProps: {
9281
- transparent: true,
9282
- opacity: 0
9680
+ side: THREE.DoubleSide,
9681
+ polygonOffset: true,
9682
+ polygonOffsetUnits: polygonOffsetUnits,
9683
+ color: numberToHexColor(color)
9283
9684
  }
9284
9685
  }), /*#__PURE__*/React__default.createElement(CCPoint, {
9285
9686
  key: point1.id,
@@ -9292,8 +9693,7 @@ const CCLine = props => {
9292
9693
 
9293
9694
  const CCPoint = props => {
9294
9695
  const {
9295
- drawingId,
9296
- pluginId
9696
+ drawingId
9297
9697
  } = React__default.useContext(ViewContext);
9298
9698
  const {
9299
9699
  objId
@@ -9306,40 +9706,33 @@ const CCPoint = props => {
9306
9706
  const userData = useUserData(objId);
9307
9707
  const {
9308
9708
  renderOrder,
9309
- polygonOffsetUnits
9709
+ polygonOffsetUnits,
9710
+ isHovered,
9711
+ isSelected
9310
9712
  } = useGeomParams(objId);
9311
9713
  const position = convertToVector(point.members.pos);
9312
- const scale = useSketchState(drawingId, pluginId, state => state.scale);
9313
9714
  React__default.useEffect(() => {
9314
9715
  setSnapToPoint(objId, new THREE.Vector3(position.x, position.y, position.z));
9315
9716
  return () => deleteSnapToPoint(objId);
9316
9717
  }, [objId, position.x, position.y, position.z]);
9317
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Point, {
9318
- position: position,
9319
- scale: scale,
9320
- meshProps: {
9718
+ return /*#__PURE__*/React__default.createElement(Point, {
9719
+ position: position // It's not possible to change polygonOffset in drei/Merged component,
9720
+ // so we have to increase size of hovered or selected point to make the point not occluded buy other ones
9721
+ ,
9722
+ scalePlus: isHovered || isSelected,
9723
+ meshProps: _objectSpread$8(_objectSpread$8({
9321
9724
  renderOrder
9322
- },
9725
+ }, handlers), {}, {
9726
+ userData
9727
+ }),
9323
9728
  materialProps: {
9324
9729
  side: THREE.DoubleSide,
9325
9730
  polygonOffset: true,
9326
9731
  polygonOffsetUnits: polygonOffsetUnits,
9327
9732
  // Put hovered point upper then not hovered (check comment in the beginnig of this file about polygonOffset).
9328
- color: color
9329
- }
9330
- }), /*#__PURE__*/React__default.createElement(Point, {
9331
- position: position,
9332
- scale: scale,
9333
- size: pointSize + hoverZone,
9334
- meshProps: _objectSpread$7({
9335
- userData,
9336
- renderOrder
9337
- }, handlers),
9338
- materialProps: {
9339
- transparent: true,
9340
- opacity: 0
9733
+ color: numberToHexColor(color)
9341
9734
  }
9342
- }));
9735
+ });
9343
9736
  };
9344
9737
 
9345
9738
  const CCArc = props => {
@@ -9364,7 +9757,6 @@ const CCArc = props => {
9364
9757
  const point = [p1, p2, p3].find(p => p.name === pointName);
9365
9758
  return convertToVector(point.members.pos);
9366
9759
  }, [p1, p2, p3]);
9367
- const scale = useSketchState(drawingId, pluginId, state => state.scale);
9368
9760
  const startPoint = React__default.useMemo(() => getArcPointPos('startPoint'), [getArcPointPos]);
9369
9761
  const endPoint = React__default.useMemo(() => getArcPointPos('endPoint'), [getArcPointPos]);
9370
9762
  const centerPoint = React__default.useMemo(() => getArcPointPos('center'), [getArcPointPos]);
@@ -9373,37 +9765,24 @@ const CCArc = props => {
9373
9765
  renderOrder,
9374
9766
  polygonOffsetUnits
9375
9767
  } = useGeomParams(objId);
9768
+ const scale = useSketchState(drawingId, pluginId, state => state.scale);
9376
9769
  return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Arc, {
9377
9770
  start: startPoint,
9378
9771
  end: endPoint,
9379
9772
  center: centerPoint,
9380
- scale: scale,
9381
9773
  clockwise: clockwise,
9382
- meshProps: {
9383
- renderOrder
9384
- },
9774
+ meshProps: _objectSpread$8({
9775
+ renderOrder,
9776
+ userData
9777
+ }, handlers),
9385
9778
  materialProps: {
9386
9779
  side: THREE.DoubleSide,
9387
9780
  polygonOffset: true,
9388
9781
  polygonOffsetUnits: polygonOffsetUnits,
9389
9782
  color: color
9390
- }
9391
- }), /*#__PURE__*/React__default.createElement(Arc, {
9392
- start: startPoint,
9393
- end: endPoint,
9394
- center: centerPoint,
9395
- scale: scale,
9396
- clockwise: clockwise,
9397
- width: arcWidth + hoverZone,
9398
- meshProps: _objectSpread$7({
9399
- renderOrder,
9400
- userData
9401
- }, handlers),
9402
- materialProps: {
9403
- transparent: true,
9404
- opacity: 0
9405
- }
9406
- }), arc.children.map(childId => /*#__PURE__*/React__default.createElement(CCPoint, {
9783
+ },
9784
+ scale: scale
9785
+ }), arc.children.map(childId => /*#__PURE__*/React__default.createElement(CCPoint, {
9407
9786
  key: childId,
9408
9787
  objId: childId
9409
9788
  })));
@@ -9449,7 +9828,7 @@ const CCCircle = props => {
9449
9828
  radius: radius,
9450
9829
  scale: scale,
9451
9830
  width: arcWidth + hoverZone,
9452
- meshProps: _objectSpread$7(_objectSpread$7({}, handlers), {}, {
9831
+ meshProps: _objectSpread$8(_objectSpread$8({}, handlers), {}, {
9453
9832
  renderOrder,
9454
9833
  userData
9455
9834
  }),
@@ -9528,7 +9907,7 @@ const SketchPlane = ({
9528
9907
  objId
9529
9908
  }
9530
9909
  })), /*#__PURE__*/React__default.createElement("gridHelper", {
9531
- args: [step * linesCount, linesCount, 0x000000, 0x333333],
9910
+ args: [step * linesCount, linesCount, 0x000000, 0x888888],
9532
9911
  quaternion: planeQuaternion,
9533
9912
  onUpdate: update
9534
9913
  }));
@@ -9603,10 +9982,11 @@ const Sketch = ({
9603
9982
  drawnObjectsRef
9604
9983
  });
9605
9984
  }, [set]);
9606
- return /*#__PURE__*/React__default.createElement("group", null, isActive && /*#__PURE__*/React__default.createElement(SketchPlane, {
9985
+ return /*#__PURE__*/React__default.createElement(MergedWrapper, null, isActive && /*#__PURE__*/React__default.createElement(SketchPlane, {
9607
9986
  objId: objId
9608
9987
  }), drawnObjects && /*#__PURE__*/React__default.createElement("group", {
9609
- ref: drawnObjectsRef
9988
+ ref: drawnObjectsRef,
9989
+ name: "sketch"
9610
9990
  }, drawnObjects, isActive && containerIds && containerIds.length === 0 && /*#__PURE__*/React__default.createElement(Constraints$2, {
9611
9991
  sketchId: objId
9612
9992
  })));
@@ -9641,10 +10021,8 @@ const TmpPoint = props => {
9641
10021
  } = React__default.useContext(ViewContext);
9642
10022
  const point = useSketchState(drawingId, pluginId, state => state.tmpObjects[props.objId]);
9643
10023
  const color = getColor$1(point.class);
9644
- const scale = useSketchState(drawingId, pluginId, state => state.scale);
9645
- return /*#__PURE__*/React__default.createElement(Point, {
10024
+ return /*#__PURE__*/React__default.createElement(Point$1, {
9646
10025
  position: point.position,
9647
- scale: scale,
9648
10026
  materialProps: {
9649
10027
  side: THREE.DoubleSide,
9650
10028
  polygonOffset: true,
@@ -9661,13 +10039,11 @@ const TmpLine = props => {
9661
10039
  } = React__default.useContext(ViewContext);
9662
10040
  const line = useSketchState(drawingId, pluginId, state => state.tmpObjects[props.objId]);
9663
10041
  const color = getColor$1(line.class);
9664
- const scale = useSketchState(drawingId, pluginId, state => state.scale);
9665
10042
  const start = useSketchState(drawingId, pluginId, state => state.tmpObjects[line.startPId]).position;
9666
10043
  const end = useSketchState(drawingId, pluginId, state => state.tmpObjects[line.endPId]).position;
9667
- return /*#__PURE__*/React__default.createElement(Line, {
10044
+ return /*#__PURE__*/React__default.createElement(Line$1, {
9668
10045
  start: start,
9669
10046
  end: end,
9670
- scale: scale,
9671
10047
  materialProps: {
9672
10048
  color
9673
10049
  }
@@ -9688,10 +10064,9 @@ const TmpArc = props => {
9688
10064
  const end = useSketchState(drawingId, pluginId, state => state.tmpObjects[arc.endPId]).position;
9689
10065
 
9690
10066
  if (arc.drawAsLine) {
9691
- return /*#__PURE__*/React__default.createElement(Line, {
10067
+ return /*#__PURE__*/React__default.createElement(Line$1, {
9692
10068
  start: start,
9693
10069
  end: end,
9694
- scale: scale,
9695
10070
  materialProps: {
9696
10071
  color: getColor$1(CCClasses.CCLine)
9697
10072
  }
@@ -9860,6 +10235,7 @@ const RubberBandRectangle = () => {
9860
10235
  function useSetScale(drawingId, pluginId) {
9861
10236
  useFrame(args => {
9862
10237
  const plugin = getPlugin(drawingId, pluginId);
10238
+ if (!plugin) return;
9863
10239
  const state = plugin.state;
9864
10240
  const sketchObj = getDrawing(drawingId).structure.tree[plugin.objectId];
9865
10241
  const sketchMatrix = MathUtils.convertToMatrix4(sketchObj.coordinateSystem);
@@ -9873,7 +10249,9 @@ function useSetScale(drawingId, pluginId) {
9873
10249
  plugin.set({
9874
10250
  step: newStep,
9875
10251
  scale: newScale
9876
- });
10252
+ }); // Old way to set scale, needed for circles. (Should be remove when circles will be implemented via Merged component)
10253
+
10254
+ setScale(newScale); // More efficient way to set scale, used buy lines and points.
9877
10255
  }
9878
10256
  });
9879
10257
  } // Turn off all handlers and hide sketch selection if global selection is active
@@ -9888,7 +10266,7 @@ function useHandleGSelection(drawingId, pluginId, activeHandler) {
9888
10266
  const prevSelected = React__default.useRef([]);
9889
10267
  React__default.useEffect(() => {
9890
10268
  // Disable all handlers if global selection is active
9891
- if (activeSelection && !prevHandler.current) {
10269
+ if (activeSelection && activeSelection !== 'UseRef' && !prevHandler.current) {
9892
10270
  prevHandler.current = activeHandler;
9893
10271
  prevSelected.current = getSketchState(drawingId, pluginId).selected;
9894
10272
  set({
@@ -9903,6 +10281,23 @@ function useHandleGSelection(drawingId, pluginId, activeHandler) {
9903
10281
  prevHandler.current = undefined;
9904
10282
  }
9905
10283
  }, [drawingId, pluginId, activeSelection, activeHandler, set]);
10284
+ } // Creates reference geometry in the sketch for all the graphic objects appearing in the 'UseRef' selection; the selection is reset after each triggering
10285
+
10286
+
10287
+ function useUseRef(drawingId, sketchId) {
10288
+ const itemsUseRef = useDrawing(drawingId, d => {
10289
+ var _d$selection$refs$Use;
10290
+
10291
+ return (_d$selection$refs$Use = d.selection.refs['UseRef']) == null ? void 0 : _d$selection$refs$Use.items;
10292
+ });
10293
+ React__default.useEffect(() => {
10294
+ if (itemsUseRef && itemsUseRef.length > 0) {
10295
+ const selApi = getDrawing(drawingId).api.selection;
10296
+ selApi.setItems('UseRef', []);
10297
+ const ids = itemsUseRef.map(item => item.data.graphicId);
10298
+ ccAPI.sketcher.createReferenceGeometry(drawingId, sketchId, ids);
10299
+ }
10300
+ }, [drawingId, sketchId, itemsUseRef]);
9906
10301
  }
9907
10302
 
9908
10303
  const getSketchBounds = boundsMember => {
@@ -9997,10 +10392,13 @@ const DrawingMode = ({
9997
10392
  set({
9998
10393
  activeHandler: HandlersList.DRAG
9999
10394
  });
10000
- return () => set({
10001
- activeHandler: undefined
10002
- });
10003
- }, [set]);
10395
+ return () => {
10396
+ const plugin = getPlugin(drawingId, pluginId);
10397
+ plugin && plugin.set({
10398
+ activeHandler: undefined
10399
+ });
10400
+ };
10401
+ }, [drawingId, pluginId, set]);
10004
10402
  useSetScale(drawingId, pluginId);
10005
10403
  const activeHandler = useSketchState(drawingId, pluginId, state => state.activeHandler);
10006
10404
  const currentHandler = React__default.useRef();
@@ -10021,6 +10419,7 @@ const DrawingMode = ({
10021
10419
  currentHandler.current = activeHandler;
10022
10420
  }, [drawingId, pluginId, activeHandler]);
10023
10421
  useHandleGSelection(drawingId, pluginId, activeHandler);
10422
+ useUseRef(drawingId, sketchId);
10024
10423
  const dimId = useDimensionSetId(drawingId, sketchId);
10025
10424
  const [, dimView] = useEmbeddedPlugin(Plugin, drawingId, pluginId, dimId, setDimId); // SketcherDimensionSet has it's own cSys that will be applied in Plugin.tsx, so apply inverse Sketch cSys.
10026
10425
  // TODO: remove it when parent plugin matrix won't be applied for embedded one.
@@ -10067,7 +10466,11 @@ const ViewImpl$d = ({
10067
10466
  drawingId,
10068
10467
  pluginId,
10069
10468
  isActive
10070
- }), [drawingId, pluginId, isActive]);
10469
+ }), [drawingId, pluginId, isActive]); // Reset scale on unmount
10470
+
10471
+ React__default.useEffect(() => {
10472
+ return () => setScale(1);
10473
+ }, []);
10071
10474
 
10072
10475
  if (planeSelection) {
10073
10476
  return null;
@@ -10097,40 +10500,6 @@ const View$d = ({
10097
10500
  }));
10098
10501
  };
10099
10502
 
10100
- const UseRef = () => {
10101
- const {
10102
- Group,
10103
- Label,
10104
- Selection,
10105
- Button
10106
- } = useBuerli(buerli => buerli.options.elements);
10107
- const {
10108
- drawingId,
10109
- pluginId
10110
- } = React__default.useContext(RootContext);
10111
- const sketchId = usePlugin(drawingId, pluginId, plugin => plugin.objectId);
10112
- const [selId, setSelId] = React__default.useState();
10113
- const createUseRef = React__default.useCallback(() => {
10114
- if (!selId) return;
10115
- const items = getDrawing(drawingId).selection.refs[selId].items;
10116
- const selApi = getDrawing(drawingId).api.selection;
10117
- selApi.setItems(selId, []);
10118
- selApi.activateSelector(null);
10119
- if (items.length === 0) return;
10120
- const ids = items.map(item => item.data.graphicId);
10121
- ccAPI.sketcher.createReferenceGeometry(drawingId, sketchId, ids);
10122
- }, [selId, drawingId, sketchId]);
10123
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Group, null, /*#__PURE__*/React__default.createElement(Label, null, "Create UseRef"), /*#__PURE__*/React__default.createElement(Selection, {
10124
- key: "useRefSelection",
10125
- drawingId: drawingId,
10126
- onCreated: setSelId,
10127
- filter: (scope, data) => lineSegmentsFilter(scope, data) || loopFilter(scope, data) || pointFilter(scope, data),
10128
- caption: "Select geometry..."
10129
- })), /*#__PURE__*/React__default.createElement(Button, {
10130
- onClick: createUseRef
10131
- }, "Create"));
10132
- };
10133
-
10134
10503
  const constraintClasses = {
10135
10504
  fixation: CCClasses.CC2DFixationConstraint,
10136
10505
  horizontality: CCClasses.CC2DHorizontalConstraint,
@@ -10156,8 +10525,7 @@ const constraintClasses = {
10156
10525
  };
10157
10526
  const Constraints$1 = () => {
10158
10527
  const {
10159
- Button,
10160
- ButtonGroup
10528
+ Button
10161
10529
  } = useBuerli(buerli => buerli.options.elements);
10162
10530
  const {
10163
10531
  drawingId,
@@ -10194,7 +10562,12 @@ const Constraints$1 = () => {
10194
10562
  }
10195
10563
  }
10196
10564
  }, [drawingId, set, selected, sketchId]);
10197
- return allowedConstraints && allowedConstraints.length > 0 ? /*#__PURE__*/React__default.createElement(ButtonGroup, null, allowedConstraints.map(constraintName => /*#__PURE__*/React__default.createElement(Button, {
10565
+ return allowedConstraints && allowedConstraints.length > 0 ? /*#__PURE__*/React__default.createElement(AntdButton.Group, {
10566
+ style: {
10567
+ flexWrap: 'wrap',
10568
+ height: 'unset !important'
10569
+ }
10570
+ }, allowedConstraints.map(constraintName => /*#__PURE__*/React__default.createElement(Button, {
10198
10571
  key: constraintName,
10199
10572
  titleText: constraintName,
10200
10573
  size: 'small',
@@ -10231,7 +10604,8 @@ const HButton = _ref => {
10231
10604
  } = React__default.useContext(RootContext);
10232
10605
  const set = getPlugin(drawingId, pluginId).set;
10233
10606
  const activeHandler = useSketchState(drawingId, pluginId, state => state.activeHandler);
10234
- const isSelectorActive = useDrawing(drawingId, drawing => drawing.selection.active) !== null;
10607
+ const activeSelector = useDrawing(drawingId, drawing => drawing.selection.active);
10608
+ const disabled = Boolean(activeSelector) && activeSelector !== 'UseRef';
10235
10609
  const isActive = activeHandler === handlerName;
10236
10610
  return /*#__PURE__*/React__default.createElement(Tooltip, {
10237
10611
  style: {
@@ -10244,7 +10618,7 @@ const HButton = _ref => {
10244
10618
  key: handlerName,
10245
10619
  value: handlerName,
10246
10620
  checked: isActive,
10247
- disabled: isSelectorActive,
10621
+ disabled: disabled,
10248
10622
  onClick: () => {
10249
10623
  if (isActive) {
10250
10624
  set({
@@ -10282,6 +10656,7 @@ const SubGroup$1 = ({
10282
10656
  } = useBuerli(buerli => buerli.options.elements);
10283
10657
  const [lastHandler, setLastHandler] = React__default.useState(handlers[0]);
10284
10658
  const menu = /*#__PURE__*/React__default.createElement(Menu, null, /*#__PURE__*/React__default.createElement(MenuItem, {
10659
+ key: "menuItem",
10285
10660
  style: {
10286
10661
  backgroundColor: 'initial',
10287
10662
  padding: '0px 5px',
@@ -10321,6 +10696,8 @@ const Handlers = () => {
10321
10696
  handlerName: HandlersList.FILLET
10322
10697
  }), /*#__PURE__*/React__default.createElement(HButton, {
10323
10698
  handlerName: HandlersList.TRIM
10699
+ }), /*#__PURE__*/React__default.createElement(HButton, {
10700
+ handlerName: HandlersList.USEREF
10324
10701
  }));
10325
10702
  };
10326
10703
 
@@ -10518,110 +10895,489 @@ const useRollbackBar = (drawingId, partId) => {
10518
10895
  }, [drawingId, opSeqId, opSeqChildren]);
10519
10896
  };
10520
10897
 
10521
- const PlaneSelectionMode = ({
10898
+ const _excluded$3 = ["items", "children"];
10899
+ const Menu = _ref => {
10900
+ let {
10901
+ items,
10902
+ children
10903
+ } = _ref,
10904
+ props = _objectWithoutProperties(_ref, _excluded$3);
10905
+
10906
+ const onItemClick = React__default.useCallback(e => {
10907
+ e.domEvent.stopPropagation();
10908
+ let item = items[e.keyPath.pop()];
10909
+
10910
+ if (item.children) {
10911
+ item = item.children[e.keyPath.pop()];
10912
+ }
10913
+ item.callback(e.domEvent);
10914
+ }, [items]);
10915
+ const menu = /*#__PURE__*/React__default.createElement(Menu$1, {
10916
+ onClick: onItemClick
10917
+ }, Object.keys(items).map(key => {
10918
+ const item = items[key];
10919
+
10920
+ if (item.children) {
10921
+ const smItem = item;
10922
+ return /*#__PURE__*/React__default.createElement(Menu$1.SubMenu, {
10923
+ title: smItem.caption,
10924
+ key: key,
10925
+ icon: smItem.icon
10926
+ }, Object.keys(smItem.children).map(chKey => {
10927
+ const chItem = smItem.children[chKey];
10928
+ return /*#__PURE__*/React__default.createElement(Menu$1.Item, {
10929
+ key: chKey,
10930
+ icon: chItem.icon
10931
+ }, chItem.caption);
10932
+ }));
10933
+ } else {
10934
+ const item_ = item;
10935
+ return /*#__PURE__*/React__default.createElement(Menu$1.Item, {
10936
+ key: key,
10937
+ icon: item_.icon
10938
+ }, item_.caption);
10939
+ }
10940
+ }));
10941
+ return /*#__PURE__*/React__default.createElement(Dropdown, _extends({
10942
+ overlay: menu,
10943
+ placement: "bottomCenter"
10944
+ }, props), children ? children : /*#__PURE__*/React__default.createElement("div", {
10945
+ style: {
10946
+ width: '24px',
10947
+ cursor: 'pointer',
10948
+ textAlign: 'center'
10949
+ },
10950
+ onClick: e => e.stopPropagation()
10951
+ }, "..."));
10952
+ };
10953
+
10954
+ const NameEdit = ({
10522
10955
  drawingId,
10523
- pluginId
10956
+ objId,
10957
+ setEditName,
10958
+ name
10524
10959
  }) => {
10525
- const {
10526
- Group,
10527
- Label,
10528
- Selection
10529
- } = useBuerli(buerli => buerli.options.elements);
10530
- const sketchId = usePlugin(drawingId, pluginId, plugin => plugin.objectId);
10531
- const curProduct = useDrawing(drawingId, d => d.structure.currentProduct);
10532
- const opSeqId = useOperationSequence(drawingId, curProduct) || -1;
10533
- const opSeqChildren = useDrawing(drawingId, d => d.structure.tree[opSeqId].children || []); // Makes base planes visible when just created, and turns them off after initialization (i.e. selecting a plane)
10960
+ const ref = React__default.useRef(null);
10961
+ const onEnter = React__default.useCallback(async e => {
10962
+ if (e.target.value !== '') {
10963
+ await ccAPI.common.setObjectName(drawingId, objId, e.target.value);
10964
+ }
10534
10965
 
10966
+ setEditName(false);
10967
+ }, [drawingId, objId, setEditName]);
10968
+ const onKeyPress = React__default.useCallback(e => {
10969
+ if (e.key !== 'Escape') return;
10970
+ setEditName(false);
10971
+ }, [setEditName]);
10535
10972
  React__default.useEffect(() => {
10536
- if (opSeqChildren.length < 7) {
10537
- // Should probably never happen, but just in case...
10538
- return;
10539
- }
10973
+ var _ref$current;
10540
10974
 
10541
- const drawing = getDrawing(drawingId);
10542
- const tree = drawing.structure.tree;
10543
- const pluginApi = drawing.api.plugin; // 4, 5, 6 are ids of XY-, XZ- and YZ-planes in the operation sequence array
10975
+ getCADState().api.blankDiv.show(() => setEditName(false));
10976
+ (_ref$current = ref.current) == null ? void 0 : _ref$current.focus({
10977
+ cursor: 'all'
10978
+ }); // Deactivate BlankDiv on dismount
10544
10979
 
10545
- const wpSeqIds = [4, 5, 6];
10546
- const basePlaneIds = wpSeqIds.map(index => tree[opSeqChildren[index]].members.refObj.value);
10547
- const wereInvisible = [];
10548
- basePlaneIds.forEach(id => {
10549
- if (drawing.plugin.visible.indexOf(id) === -1) {
10550
- wereInvisible.push(id);
10551
- pluginApi.setVisiblePlugin(id, true);
10552
- }
10553
- }); // Make planes invisible again
10980
+ return () => getCADState().api.blankDiv.hide();
10981
+ }, [setEditName]); // When BlankDiv is active, increase zIndex so this element would overlap it
10554
10982
 
10555
- return () => {
10556
- const planeId = getDrawing(drawingId).structure.tree[sketchId].members.planeReference.value;
10557
- wereInvisible.forEach(id => {
10558
- if (id !== planeId) {
10559
- pluginApi.setVisiblePlugin(id, false);
10560
- }
10561
- });
10562
- }; // Should always happen just once
10563
- // eslint-disable-next-line react-hooks/exhaustive-deps
10564
- }, []);
10565
- return /*#__PURE__*/React__default.createElement(Group, null, /*#__PURE__*/React__default.createElement(Label, null, "Select sketcher plane"), /*#__PURE__*/React__default.createElement(Selection, {
10566
- drawingId: drawingId,
10567
- filter: (scope, data) => {
10568
- return scope === TreeObjScope && data.object.class === CCClasses.CCWorkPlane || scope === BuerliScope && data === GraphicType.PLANE;
10569
- },
10570
- onChange: items => {
10571
- if (items.length !== 0) {
10572
- if (items[0].scope === TreeObjScope) {
10573
- ccAPI.sketcher.setWorkPlane(drawingId, sketchId, items[0].data.object.id);
10574
- } else {
10575
- ccAPI.sketcher.createAndSetWorkPlane(drawingId, sketchId, items[0].data.graphicId);
10576
- }
10577
- }
10983
+ const showBlankDiv = useCADStore(s => s.blankDiv.isActive);
10984
+ const zIndex = showBlankDiv ? blankZIndex + 1 : 0;
10985
+ return /*#__PURE__*/React__default.createElement(Input, {
10986
+ style: {
10987
+ zIndex
10578
10988
  },
10579
- defaultActive: true
10580
- }));
10989
+ ref: ref,
10990
+ onPressEnter: onEnter,
10991
+ defaultValue: name,
10992
+ size: "small",
10993
+ onKeyDown: onKeyPress,
10994
+ onBlur: () => setEditName(false)
10995
+ });
10581
10996
  };
10582
10997
 
10583
- const MousePos = () => {
10584
- const {
10585
- Group,
10586
- Label
10587
- } = useBuerli(buerli => buerli.options.elements);
10588
- const {
10589
- drawingId,
10590
- pluginId
10591
- } = React__default.useContext(RootContext);
10592
- const pos = useSketchState(drawingId, pluginId, state => state.mousePos);
10593
- return pos ? /*#__PURE__*/React__default.createElement(Group, null, /*#__PURE__*/React__default.createElement(Label, null, "Mouse:"), /*#__PURE__*/React__default.createElement(Label, {
10594
- flex: "inherit"
10595
- }, "X:"), /*#__PURE__*/React__default.createElement(Label, null, pos.x.toFixed(2)), /*#__PURE__*/React__default.createElement(Label, {
10596
- flex: "inherit"
10597
- }, "Y:"), /*#__PURE__*/React__default.createElement(Label, null, pos.y.toFixed(2))) : null;
10598
- };
10998
+ const FlexRow = styled.div`
10999
+ display: flex;
11000
+ flex-direction: row;
11001
+ `;
11002
+ const FlexReverseRow = styled.div`
11003
+ display: flex;
11004
+ flex-direction: row-reverse;
11005
+ `;
11006
+ const Link = styled.a`
11007
+ color: #4f4f4f;
11008
+ &:hover {
11009
+ text-decoration: underline;
11010
+ text-decoration-color: #4f4f4f;
11011
+ color: #4f4f4f;
11012
+ }
11013
+ `;
11014
+ const HoveredDiv = styled.div`
11015
+ width: 100%;
11016
+ display: flex;
11017
+ justify-content: space-between;
11018
+ cursor: default;
11019
+ background-color: ${props => props.hovered ? '#f0f0f0' : undefined};
11020
+ border-bottom: ${props => props.bordered ? '1px solid #f0f0f0' : undefined};
11021
+ padding: ${props => props.bordered ? '4px 10px' : undefined};
11022
+ &:hover {
11023
+ background-color: #f0f0f0;
11024
+ }
11025
+ `;
10599
11026
 
10600
- const TabIcon = ({
10601
- url,
10602
- tooltip
11027
+ const {
11028
+ Text: Text$3
11029
+ } = Typography;
11030
+ const EntityName = ({
11031
+ name,
11032
+ disabled,
11033
+ strong,
11034
+ onClick,
11035
+ onMouseEnter,
11036
+ onMouseLeave
10603
11037
  }) => {
10604
- const {
10605
- Tooltip
10606
- } = useBuerli(b => b.options.elements);
10607
- return /*#__PURE__*/React__default.createElement(Tooltip, {
10608
- title: tooltip,
10609
- placement: "top"
10610
- }, /*#__PURE__*/React__default.createElement("div", {
10611
- style: {
10612
- marginRight: '3px',
10613
- marginLeft: '3px'
10614
- }
10615
- }, /*#__PURE__*/React__default.createElement("img", {
10616
- style: {
10617
- width: 24,
10618
- height: 24
10619
- },
10620
- src: url
10621
- })));
11038
+ return /*#__PURE__*/React__default.createElement(Link, {
11039
+ onClick: onClick,
11040
+ onMouseEnter: onMouseEnter,
11041
+ onMouseLeave: onMouseLeave
11042
+ }, /*#__PURE__*/React__default.createElement(Text$3, {
11043
+ disabled: disabled,
11044
+ strong: strong
11045
+ }, name));
10622
11046
  };
10623
11047
 
10624
- const SketchMode = ({
11048
+ const Indent = () => {
11049
+ return /*#__PURE__*/React__default.createElement("span", {
11050
+ className: "ant-tree-indent"
11051
+ }, /*#__PURE__*/React__default.createElement("span", {
11052
+ className: "ant-tree-indent-unit"
11053
+ }));
11054
+ };
11055
+ const Indents = ({
11056
+ level
11057
+ }) => {
11058
+ const arr = Array.from(Array(level).keys());
11059
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, arr.map(i => /*#__PURE__*/React__default.createElement(Indent, {
11060
+ key: i
11061
+ })));
11062
+ };
11063
+ const CollapseButton = ({
11064
+ collapsed,
11065
+ onClick
11066
+ }) => {
11067
+ return /*#__PURE__*/React__default.createElement("span", {
11068
+ className: "ant-tree-switcher",
11069
+ onClick: onClick
11070
+ }, /*#__PURE__*/React__default.createElement("span", {
11071
+ role: "img",
11072
+ "aria-label": "caret-down",
11073
+ className: "anticon anticon-caret-down ant-tree-switcher-icon"
11074
+ }, collapsed ? /*#__PURE__*/React__default.createElement(CaretRightOutlined, null) : /*#__PURE__*/React__default.createElement(CaretDownOutlined, null)));
11075
+ };
11076
+
11077
+ function useMenuItems$4(drawingId, pluginId, objectId, setRename) {
11078
+ const {
11079
+ set,
11080
+ objectId: sketchId
11081
+ } = getPlugin(drawingId, pluginId);
11082
+ return React__default.useMemo(() => {
11083
+ return {
11084
+ rename: {
11085
+ caption: 'rename',
11086
+ icon: /*#__PURE__*/React__default.createElement(EditOutlined, null),
11087
+ callback: () => {
11088
+ setRename(true);
11089
+ }
11090
+ },
11091
+ delete: {
11092
+ caption: 'delete',
11093
+ icon: /*#__PURE__*/React__default.createElement(DeleteOutlined, null),
11094
+ callback: () => {
11095
+ ccAPI.sketcher.removeObjects(drawingId, sketchId, [objectId]);
11096
+ const tree = getDrawing(drawingId).structure.tree;
11097
+ set(state_ => {
11098
+ const selected = state_.selected.filter(id => id !== objectId && tree[id].parent !== objectId);
11099
+ return {
11100
+ selected
11101
+ };
11102
+ });
11103
+ }
11104
+ }
11105
+ };
11106
+ }, [drawingId, sketchId, objectId, set, setRename]);
11107
+ }
11108
+
11109
+ const {
11110
+ Text: Text$2
11111
+ } = Typography;
11112
+
11113
+ const ObjTitle = ({
11114
+ objId,
11115
+ withMenu
11116
+ }) => {
11117
+ const {
11118
+ drawingId,
11119
+ pluginId
11120
+ } = React__default.useContext(RootContext);
11121
+ const name = useDrawing(drawingId, d => d.structure.tree[objId].name) || '';
11122
+ const objClass = useDrawing(drawingId, d => d.structure.tree[objId].class);
11123
+ const isHovered = useSketchState(drawingId, pluginId, s => s.hovered === objId);
11124
+ const isSelected = useSketchState(drawingId, pluginId, s => s.selected.indexOf(objId) !== -1);
11125
+ const color = isSelected ? '#ffa500' : isHovered ? '#28d79f' : undefined; // TODO: Rename resources so that they have more generic names, i.e. 'CC_Point' instead of 'drawPoint', etc
11126
+
11127
+ const imgName = React__default.useMemo(() => {
11128
+ switch (objClass) {
11129
+ case CCClasses.CCPoint:
11130
+ return HandlersList.DRAWPOINT;
11131
+
11132
+ case CCClasses.CCLine:
11133
+ return HandlersList.DRAWLINE;
11134
+
11135
+ case CCClasses.CCArc:
11136
+ return HandlersList.DRAWARCCENTER;
11137
+
11138
+ case CCClasses.CCCircle:
11139
+ return HandlersList.DRAWCIRCLE;
11140
+
11141
+ default:
11142
+ return objClass;
11143
+ }
11144
+ }, [objClass]);
11145
+ const [rename, setRename] = React__default.useState(false);
11146
+ const [isMenuHovered, setIsMenuHovered] = React__default.useState(false);
11147
+ const menuItems = useMenuItems$4(drawingId, pluginId, objId, setRename);
11148
+ const activeHandler = useSketchState(drawingId, pluginId, state => state.activeHandler);
11149
+ const globalSelection = useTreeObjSelection(drawingId, objId);
11150
+ const onClickSel = globalSelection.handlers.onClick; // TODO: Implement global selection in onClick? Not sure if needed...
11151
+
11152
+ const onClick = React__default.useCallback(() => {
11153
+ if (activeHandler === HandlersList.DRAG) {
11154
+ select(drawingId, pluginId, objId);
11155
+ } else if (!activeHandler) {
11156
+ // if no handler is active, some selector should be active
11157
+ onClickSel && onClickSel();
11158
+ }
11159
+ }, [drawingId, pluginId, objId, activeHandler, onClickSel]);
11160
+ const onMouseEnter = React__default.useCallback(() => {
11161
+ hover(drawingId, pluginId, objId);
11162
+ }, [drawingId, pluginId, objId]);
11163
+ const onMouseLeave = React__default.useCallback(() => {
11164
+ unhover(drawingId, pluginId, objId);
11165
+ }, [drawingId, pluginId, objId]);
11166
+ const nameComponent = rename ? /*#__PURE__*/React__default.createElement(NameEdit, {
11167
+ drawingId: drawingId,
11168
+ objId: objId,
11169
+ setEditName: setRename,
11170
+ name: name
11171
+ }) : /*#__PURE__*/React__default.createElement(EntityName, {
11172
+ name: name,
11173
+ onClick: onClick,
11174
+ onMouseEnter: onMouseEnter,
11175
+ onMouseLeave: onMouseLeave
11176
+ });
11177
+ return /*#__PURE__*/React__default.createElement(HoveredDiv, {
11178
+ hovered: isMenuHovered,
11179
+ style: {
11180
+ backgroundColor: color
11181
+ }
11182
+ }, /*#__PURE__*/React__default.createElement(Space, null, imgName && resources[imgName] && /*#__PURE__*/React__default.createElement("img", {
11183
+ style: {
11184
+ width: 18,
11185
+ height: 18,
11186
+ verticalAlign: '-4px'
11187
+ },
11188
+ src: resources[imgName]
11189
+ }), nameComponent), withMenu && /*#__PURE__*/React__default.createElement(Menu, {
11190
+ items: menuItems,
11191
+ onVisibleChange: setIsMenuHovered
11192
+ }));
11193
+ };
11194
+
11195
+ const SketchObj = ({
11196
+ objId,
11197
+ level
11198
+ }) => {
11199
+ const {
11200
+ drawingId
11201
+ } = React__default.useContext(RootContext);
11202
+ const children = useDrawing(drawingId, d => d.structure.tree[objId].children || []);
11203
+ const [collapsed, setCollapsed] = React__default.useState(true);
11204
+ return /*#__PURE__*/React__default.createElement("div", null, /*#__PURE__*/React__default.createElement(FlexRow, null, /*#__PURE__*/React__default.createElement(Indents, {
11205
+ level: level
11206
+ }), children.length > 0 ? /*#__PURE__*/React__default.createElement(CollapseButton, {
11207
+ collapsed: collapsed,
11208
+ onClick: () => setCollapsed(x => !x)
11209
+ }) : /*#__PURE__*/React__default.createElement(Indent, null), /*#__PURE__*/React__default.createElement(ObjTitle, {
11210
+ objId: objId,
11211
+ withMenu: level === 0
11212
+ })), children.map(childId => /*#__PURE__*/React__default.createElement("div", {
11213
+ key: childId,
11214
+ style: {
11215
+ display: collapsed ? 'none' : 'block'
11216
+ }
11217
+ }, /*#__PURE__*/React__default.createElement(SketchObj, {
11218
+ objId: childId,
11219
+ level: level + 1
11220
+ }))));
11221
+ };
11222
+
11223
+ const Details = () => {
11224
+ const {
11225
+ Collapse
11226
+ } = useBuerli(buerli => buerli.options.elements);
11227
+ const {
11228
+ drawingId,
11229
+ pluginId
11230
+ } = React__default.useContext(RootContext);
11231
+ const sketchId = usePlugin(drawingId, pluginId, plugin => plugin.objectId);
11232
+ const sketchChildren = useDrawing(drawingId, drawing => drawing.structure.tree[sketchId].children);
11233
+ const {
11234
+ geometry,
11235
+ constraints,
11236
+ isTrimActive
11237
+ } = React__default.useMemo(() => {
11238
+ const tree = getDrawing(drawingId).structure.tree;
11239
+ const geometry_ = (sketchChildren == null ? void 0 : sketchChildren.filter(id => isSketchGeometry(tree[id].class))) || [];
11240
+ const constraints_ = (sketchChildren == null ? void 0 : sketchChildren.filter(id => is2DConstraint(tree[id].class))) || [];
11241
+ const isTrimActive_ = (sketchChildren == null ? void 0 : sketchChildren.findIndex(id => tree[id].class === CCClasses.CCContainer)) !== -1;
11242
+ return {
11243
+ geometry: geometry_,
11244
+ constraints: constraints_,
11245
+ isTrimActive: isTrimActive_
11246
+ };
11247
+ }, [drawingId, sketchChildren]);
11248
+ return /*#__PURE__*/React__default.createElement(Collapse, {
11249
+ header: "Details",
11250
+ isActive: false
11251
+ }, geometry.length === 0 && /*#__PURE__*/React__default.createElement(Text$2, {
11252
+ strong: true
11253
+ }, "The sketch is empty"), geometry.length > 0 && isTrimActive && /*#__PURE__*/React__default.createElement(Text$2, {
11254
+ strong: true
11255
+ }, "Trim is active"), geometry.length > 0 && !isTrimActive && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Text$2, {
11256
+ strong: true
11257
+ }, "Geometry"), !isTrimActive && geometry.map(childId => /*#__PURE__*/React__default.createElement(SketchObj, {
11258
+ objId: childId,
11259
+ key: childId,
11260
+ level: 0
11261
+ }))), constraints.length > 0 && !isTrimActive && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Text$2, {
11262
+ strong: true
11263
+ }, "Constraints"), constraints.map(childId => /*#__PURE__*/React__default.createElement(SketchObj, {
11264
+ objId: childId,
11265
+ key: childId,
11266
+ level: 0
11267
+ }))));
11268
+ };
11269
+
11270
+ const PlaneSelectionMode = ({
11271
+ drawingId,
11272
+ pluginId
11273
+ }) => {
11274
+ const {
11275
+ Group,
11276
+ Label,
11277
+ Selection
11278
+ } = useBuerli(buerli => buerli.options.elements);
11279
+ const sketchId = usePlugin(drawingId, pluginId, plugin => plugin.objectId);
11280
+ const curProduct = useDrawing(drawingId, d => d.structure.currentProduct);
11281
+ const opSeqId = useOperationSequence(drawingId, curProduct) || -1;
11282
+ const opSeqChildren = useDrawing(drawingId, d => d.structure.tree[opSeqId].children || []); // Makes base planes visible when just created, and turns them off after initialization (i.e. selecting a plane)
11283
+
11284
+ React__default.useEffect(() => {
11285
+ if (opSeqChildren.length < 7) {
11286
+ // Should probably never happen, but just in case...
11287
+ return;
11288
+ }
11289
+
11290
+ const drawing = getDrawing(drawingId);
11291
+ const tree = drawing.structure.tree;
11292
+ const pluginApi = drawing.api.plugin; // 4, 5, 6 are ids of XY-, XZ- and YZ-planes in the operation sequence array
11293
+
11294
+ const wpSeqIds = [4, 5, 6];
11295
+ const basePlaneIds = wpSeqIds.map(index => tree[opSeqChildren[index]].members.refObj.value);
11296
+ const wereInvisible = [];
11297
+ basePlaneIds.forEach(id => {
11298
+ if (drawing.plugin.visible.indexOf(id) === -1) {
11299
+ wereInvisible.push(id);
11300
+ pluginApi.setVisiblePlugin(id, true);
11301
+ }
11302
+ }); // Make planes invisible again
11303
+
11304
+ return () => {
11305
+ const drawing_ = getDrawing(drawingId);
11306
+
11307
+ if (drawing_) {
11308
+ var _drawing_$structure$t, _drawing_$structure$t2;
11309
+
11310
+ const pluginApi_ = drawing_.api.plugin;
11311
+ const planeId = (_drawing_$structure$t = drawing_.structure.tree[sketchId]) == null ? void 0 : (_drawing_$structure$t2 = _drawing_$structure$t.members) == null ? void 0 : _drawing_$structure$t2.planeReference.value;
11312
+ wereInvisible.forEach(id => {
11313
+ if (id !== planeId) {
11314
+ pluginApi_.setVisiblePlugin(id, false);
11315
+ }
11316
+ });
11317
+ }
11318
+ }; // Should always happen just once
11319
+ // eslint-disable-next-line react-hooks/exhaustive-deps
11320
+ }, []);
11321
+ return /*#__PURE__*/React__default.createElement(Group, null, /*#__PURE__*/React__default.createElement(Label, null, "Select sketcher plane"), /*#__PURE__*/React__default.createElement(Selection, {
11322
+ drawingId: drawingId,
11323
+ filter: (scope, data) => {
11324
+ return scope === TreeObjScope && data.object.class === CCClasses.CCWorkPlane || scope === BuerliScope && data === GraphicType.PLANE;
11325
+ },
11326
+ onChange: items => {
11327
+ if (items.length !== 0) {
11328
+ if (items[0].scope === TreeObjScope) {
11329
+ ccAPI.sketcher.setWorkPlane(drawingId, sketchId, items[0].data.object.id);
11330
+ } else {
11331
+ ccAPI.sketcher.createAndSetWorkPlane(drawingId, sketchId, items[0].data.graphicId);
11332
+ }
11333
+ }
11334
+ },
11335
+ defaultActive: true
11336
+ }));
11337
+ };
11338
+
11339
+ const MousePos = () => {
11340
+ const {
11341
+ Group,
11342
+ Label
11343
+ } = useBuerli(buerli => buerli.options.elements);
11344
+ const {
11345
+ drawingId,
11346
+ pluginId
11347
+ } = React__default.useContext(RootContext);
11348
+ const pos = useSketchState(drawingId, pluginId, state => state.mousePos);
11349
+ return pos ? /*#__PURE__*/React__default.createElement(Group, null, /*#__PURE__*/React__default.createElement(Label, null, "Mouse:"), /*#__PURE__*/React__default.createElement(Label, {
11350
+ flex: "inherit"
11351
+ }, "X:"), /*#__PURE__*/React__default.createElement(Label, null, pos.x.toFixed(2)), /*#__PURE__*/React__default.createElement(Label, {
11352
+ flex: "inherit"
11353
+ }, "Y:"), /*#__PURE__*/React__default.createElement(Label, null, pos.y.toFixed(2))) : null;
11354
+ };
11355
+
11356
+ const TabIcon = ({
11357
+ url,
11358
+ tooltip
11359
+ }) => {
11360
+ const {
11361
+ Tooltip
11362
+ } = useBuerli(b => b.options.elements);
11363
+ return /*#__PURE__*/React__default.createElement(Tooltip, {
11364
+ title: tooltip,
11365
+ placement: "top"
11366
+ }, /*#__PURE__*/React__default.createElement("div", {
11367
+ style: {
11368
+ marginRight: '3px',
11369
+ marginLeft: '3px'
11370
+ }
11371
+ }, /*#__PURE__*/React__default.createElement("img", {
11372
+ style: {
11373
+ width: 24,
11374
+ height: 24
11375
+ },
11376
+ src: url
11377
+ })));
11378
+ };
11379
+
11380
+ const SketchMode = ({
10625
11381
  drawingId,
10626
11382
  pluginId
10627
11383
  }) => {
@@ -10666,7 +11422,7 @@ const SketchMode = ({
10666
11422
  });
10667
11423
  }
10668
11424
  })), /*#__PURE__*/React__default.createElement(MousePos, null), /*#__PURE__*/React__default.createElement(Collapse, {
10669
- header: "Patterns and use reference",
11425
+ header: "Patterns",
10670
11426
  isActive: false
10671
11427
  }, /*#__PURE__*/React__default.createElement(Tabs, {
10672
11428
  tabBarGutter: 0,
@@ -10691,13 +11447,7 @@ const SketchMode = ({
10691
11447
  tooltip: "Mirror copy pattern."
10692
11448
  }),
10693
11449
  key: "Mirror"
10694
- }, /*#__PURE__*/React__default.createElement(MirrorPattern, null)), /*#__PURE__*/React__default.createElement(TabPane, {
10695
- tab: /*#__PURE__*/React__default.createElement(TabIcon, {
10696
- url: resources['useRef'],
10697
- tooltip: "Use reference."
10698
- }),
10699
- key: "UseRef"
10700
- }, /*#__PURE__*/React__default.createElement(UseRef, null))))));
11450
+ }, /*#__PURE__*/React__default.createElement(MirrorPattern, null)))), /*#__PURE__*/React__default.createElement(Details, null)));
10701
11451
  };
10702
11452
 
10703
11453
  const RootImpl$f = ({
@@ -10707,22 +11457,23 @@ const RootImpl$f = ({
10707
11457
  const objectId = usePlugin(drawingId, pluginId, plugin => plugin.objectId);
10708
11458
  const sketch = useDrawing(drawingId, drawing => drawing.structure.tree[objectId]);
10709
11459
  const planeSelected = sketch.members.planeReference.value !== 0;
10710
- const {
10711
- set
10712
- } = getPlugin(drawingId, pluginId);
10713
11460
  React__default.useEffect(() => {
10714
11461
  // Reset some fields in state and force sketch visibility when sketch is unmounted.
10715
11462
  return () => {
10716
- const pluginApi = getDrawing(drawingId).api.plugin;
10717
- pluginApi.setVisiblePlugin(pluginId, true);
10718
- set({
10719
- tmpObjects: {},
10720
- selected: [],
10721
- hovered: UNDEFINEDID,
10722
- highlighted: []
10723
- });
11463
+ const plugin = getPlugin(drawingId, pluginId); // Only do stuff if plugin exists in the store when unmounting
11464
+
11465
+ if (plugin) {
11466
+ const pluginApi = getDrawing(drawingId).api.plugin;
11467
+ pluginApi.setVisiblePlugin(pluginId, true);
11468
+ plugin.set({
11469
+ tmpObjects: {},
11470
+ selected: [],
11471
+ hovered: UNDEFINEDID,
11472
+ highlighted: []
11473
+ });
11474
+ }
10724
11475
  };
10725
- }, [drawingId, pluginId, set]);
11476
+ }, [drawingId, pluginId]);
10726
11477
  React__default.useEffect(() => {
10727
11478
  if (!planeSelected) {
10728
11479
  return;
@@ -10980,7 +11731,7 @@ const ViewImpl$c = ({
10980
11731
  handlers
10981
11732
  } = useTreeObjSelection(drawingId, objectId);
10982
11733
  const color = getColor(isHovered, isSelected, direction, workAxisObj.members.Type.value);
10983
- const ref = useScale(position.clone(), sf => [3 * sf, 3 * sf, 3 * sf]);
11734
+ const ref = useScale$1(position.clone(), sf => [3 * sf, 3 * sf, 3 * sf]);
10984
11735
  return /*#__PURE__*/React__default.createElement(HUD, null, /*#__PURE__*/React__default.createElement("group", {
10985
11736
  ref: ref,
10986
11737
  position: position
@@ -11501,7 +12252,7 @@ const ViewImpl$a = ({
11501
12252
  handlers
11502
12253
  } = useTreeObjSelection(drawingId, objectId);
11503
12254
  const color = isHovered ? 0x28d79f : isSelected ? 0xa70b0b : 0x111111;
11504
- const ref = useScale(position.clone(), sf => [3 * sf, 3 * sf, 3 * sf]);
12255
+ const ref = useScale$1(position.clone(), sf => [3 * sf, 3 * sf, 3 * sf]);
11505
12256
  return /*#__PURE__*/React__default.createElement(HUD, null, /*#__PURE__*/React__default.createElement("group", {
11506
12257
  ref: ref,
11507
12258
  position: position
@@ -11542,9 +12293,9 @@ var index$c = /*#__PURE__*/Object.freeze({
11542
12293
  description: description$c
11543
12294
  });
11544
12295
 
11545
- function ownKeys$6(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
12296
+ function ownKeys$7(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
11546
12297
 
11547
- function _objectSpread$6(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$6(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$6(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
12298
+ function _objectSpread$7(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$7(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$7(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
11548
12299
 
11549
12300
  const NumInput = ({
11550
12301
  onChange,
@@ -11605,7 +12356,7 @@ const CSysEditor = ({
11605
12356
  const [z, setZ] = React__default.useState(() => userValue[csysRow].z);
11606
12357
  React__default.useEffect(() => {
11607
12358
  setUserValue(val => {
11608
- const newVal = [_objectSpread$6({}, val[0]), _objectSpread$6({}, val[1]), _objectSpread$6({}, val[2]), _objectSpread$6({}, val[3])];
12359
+ const newVal = [_objectSpread$7({}, val[0]), _objectSpread$7({}, val[1]), _objectSpread$7({}, val[2]), _objectSpread$7({}, val[3])];
11609
12360
  newVal[csysRow] = {
11610
12361
  x,
11611
12362
  y,
@@ -12216,36 +12967,36 @@ function ViewImpl$8({
12216
12967
  length: zAxisLength + scale * 10,
12217
12968
  width: arrowWidth,
12218
12969
  color: 0x11116f
12219
- }), /*#__PURE__*/React__default.createElement(Point$1, {
12970
+ }), /*#__PURE__*/React__default.createElement(Point$2, {
12220
12971
  position: origin,
12221
12972
  radius: originPointWidth,
12222
12973
  color: 0x111111
12223
- }), axisPoints.map(point => /*#__PURE__*/React__default.createElement(Point$1, {
12974
+ }), axisPoints.map(point => /*#__PURE__*/React__default.createElement(Point$2, {
12224
12975
  key: point.key,
12225
12976
  position: point.position,
12226
12977
  radius: axisPointWidth,
12227
12978
  color: point.color
12228
- })), /*#__PURE__*/React__default.createElement(Point$1, {
12979
+ })), /*#__PURE__*/React__default.createElement(Point$2, {
12229
12980
  position: xMin,
12230
12981
  radius: boundaryPointWidth,
12231
12982
  color: 0x6f1111
12232
- }), /*#__PURE__*/React__default.createElement(Point$1, {
12983
+ }), /*#__PURE__*/React__default.createElement(Point$2, {
12233
12984
  position: xMax,
12234
12985
  radius: boundaryPointWidth,
12235
12986
  color: 0x6f1111
12236
- }), /*#__PURE__*/React__default.createElement(Point$1, {
12987
+ }), /*#__PURE__*/React__default.createElement(Point$2, {
12237
12988
  position: yMin,
12238
12989
  radius: boundaryPointWidth,
12239
12990
  color: 0x116f11
12240
- }), /*#__PURE__*/React__default.createElement(Point$1, {
12991
+ }), /*#__PURE__*/React__default.createElement(Point$2, {
12241
12992
  position: yMax,
12242
12993
  radius: boundaryPointWidth,
12243
12994
  color: 0x116f11
12244
- }), /*#__PURE__*/React__default.createElement(Point$1, {
12995
+ }), /*#__PURE__*/React__default.createElement(Point$2, {
12245
12996
  position: zMin,
12246
12997
  radius: boundaryPointWidth,
12247
12998
  color: 0x11116f
12248
- }), /*#__PURE__*/React__default.createElement(Point$1, {
12999
+ }), /*#__PURE__*/React__default.createElement(Point$2, {
12249
13000
  position: zMax,
12250
13001
  radius: boundaryPointWidth,
12251
13002
  color: 0x11116f
@@ -12943,6 +13694,47 @@ const CSysDisplayValidator = ({
12943
13694
  }, children);
12944
13695
  };
12945
13696
 
13697
+ function useFeaturesIds(drawingId, curNodeId) {
13698
+ const curClass = useDrawing(drawingId, d => {
13699
+ var _d$structure$tree$cur;
13700
+
13701
+ return (_d$structure$tree$cur = d.structure.tree[curNodeId]) == null ? void 0 : _d$structure$tree$cur.class;
13702
+ });
13703
+ const prodId = useDrawing(drawingId, d => {
13704
+ if (curClass === CCClasses.CCProductReference || curClass === CCClasses.CCProductReferenceET) {
13705
+ const node = d.structure.tree[curNodeId];
13706
+ return node.members.productId.value;
13707
+ }
13708
+
13709
+ return curNodeId;
13710
+ });
13711
+ const opSeqId = useOperationSequence(drawingId, prodId);
13712
+ const opSeqChildren = useDrawing(drawingId, d => {
13713
+ var _d$structure$tree;
13714
+
13715
+ return (_d$structure$tree = d.structure.tree[opSeqId || -1]) == null ? void 0 : _d$structure$tree.children;
13716
+ });
13717
+ const tree = getDrawing(drawingId).structure.tree;
13718
+ const featureIds = (opSeqChildren == null ? void 0 : opSeqChildren.map(refId => tree[refId].members.refObj.value)) || [];
13719
+ return featureIds;
13720
+ }
13721
+ function getFeaturesIds(drawingId, curNodeId) {
13722
+ var _tree$prodId, _tree;
13723
+
13724
+ const tree = getDrawing(drawingId).structure.tree;
13725
+ const curClass = tree[curNodeId].class;
13726
+ const prodId = curClass === CCClasses.CCProductReference || curClass === CCClasses.CCProductReferenceET ? tree[curNodeId].members.productId.value : curNodeId;
13727
+ const prodChildren = (_tree$prodId = tree[prodId]) == null ? void 0 : _tree$prodId.children;
13728
+ const opSeqId = prodChildren == null ? void 0 : prodChildren.find(id => {
13729
+ var _tree$id;
13730
+
13731
+ return ((_tree$id = tree[id]) == null ? void 0 : _tree$id.class) === CCClasses.CCOperationSequence;
13732
+ });
13733
+ const opSeqChildren = (_tree = tree[opSeqId || -1]) == null ? void 0 : _tree.children;
13734
+ const featureIds = (opSeqChildren == null ? void 0 : opSeqChildren.map(refId => tree[refId].members.refObj.value)) || [];
13735
+ return featureIds;
13736
+ }
13737
+
12946
13738
  const getFlipMatrix = (flip, xAxis, yAxis) => {
12947
13739
  switch (flip) {
12948
13740
  case FlipType.FLIP_X:
@@ -13285,9 +14077,8 @@ const CSysDisplayImpl = ({
13285
14077
  const productId = ((_tree$id$members = tree[id].members) == null ? void 0 : (_tree$id$members$prod = _tree$id$members.productId) == null ? void 0 : _tree$id$members$prod.value) || tree[id].id;
13286
14078
 
13287
14079
  if (prToCsysMap[productId] === undefined) {
13288
- var _tree$productId$featu;
13289
-
13290
- const csysIds = ((_tree$productId$featu = tree[productId].features) == null ? void 0 : _tree$productId$featu.filter(featureId => tree[featureId].class === CCClasses.CCWorkCoordSystem)) || [];
14080
+ const features = getFeaturesIds(drawingId, productId);
14081
+ const csysIds = (features == null ? void 0 : features.filter(featureId => tree[featureId].class === CCClasses.CCWorkCoordSystem)) || [];
13291
14082
  prToCsysMap[productId] = csysIds;
13292
14083
  }
13293
14084
 
@@ -14987,216 +15778,77 @@ function readFile(file, type) {
14987
15778
  break;
14988
15779
 
14989
15780
  case 'Text':
14990
- reader.readAsText(file);
14991
- break;
14992
-
14993
- case 'ArrayBuffer':
14994
- default:
14995
- reader.readAsArrayBuffer(file);
14996
- break;
14997
- }
14998
- });
14999
- }
15000
- /**
15001
- * Simple helper functions for file interaction.
15002
- */
15003
-
15004
-
15005
- const FileUtils = {
15006
- /**
15007
- * Loads a file from the file system.
15008
- * It uses @see document and is therefore directly dependent on the DOM.
15009
- *
15010
- * @param onLoad The callback.
15011
- * @param type The content type.
15012
- */
15013
- loadFile: (onLoad, type, multiple) => {
15014
- const handler = event => {
15015
- if (event.target && event.target.files) {
15016
- const files = [...event.target.files];
15017
- const promises = files.map(f => readFile(f, type));
15018
- Promise.all(promises).then(res => onLoad(res)).catch();
15019
- event.target.value = '';
15020
- }
15021
- };
15022
-
15023
- const loaderId = '________buerli-react-cad________';
15024
- const loaderSelector = `#${loaderId}`;
15025
- let loader = document.querySelector(loaderSelector);
15026
-
15027
- if (!loader || !loader.onchange) {
15028
- loader = document.createElement('input');
15029
- loader.id = loaderId;
15030
- loader.type = 'file';
15031
- loader.multiple = multiple || false;
15032
- loader.style.display = 'none';
15033
- document.body.appendChild(loader);
15034
- }
15035
-
15036
- if (loader) {
15037
- loader.onchange = handler;
15038
- loader.click();
15039
- }
15040
- },
15041
- exportNode: async (drawingId, objectId, type = 'of1') => {
15042
- var _members$productId;
15043
-
15044
- const structure = getDrawing(drawingId).structure;
15045
- const tree = structure.tree;
15046
- const isRoot = objectId === structure.root;
15047
- const productId = ((_members$productId = tree[objectId].members.productId) == null ? void 0 : _members$productId.value) || objectId;
15048
- const name = tree[productId].name;
15049
- const data = isRoot ? await ccAPI.baseModeler.save(drawingId, type) : await ccAPI.assemblyBuilder.exportNode(drawingId, objectId, type);
15050
-
15051
- if (data) {
15052
- const link = document.createElement('a');
15053
- link.href = window.URL.createObjectURL(new Blob([data], {
15054
- type: 'application/octet-stream'
15055
- }));
15056
- link.download = `${name}.${type}`;
15057
- link.click();
15058
- }
15059
- }
15060
- };
15061
-
15062
- const _excluded$3 = ["items", "children"];
15063
- const Menu = _ref => {
15064
- let {
15065
- items,
15066
- children
15067
- } = _ref,
15068
- props = _objectWithoutProperties(_ref, _excluded$3);
15069
-
15070
- const onItemClick = React__default.useCallback(e => {
15071
- e.domEvent.stopPropagation();
15072
- let item = items[e.keyPath.pop()];
15073
-
15074
- if (item.children) {
15075
- item = item.children[e.keyPath.pop()];
15076
- }
15077
- item.callback(e.domEvent);
15078
- }, [items]);
15079
- const menu = /*#__PURE__*/React__default.createElement(Menu$1, {
15080
- onClick: onItemClick
15081
- }, Object.keys(items).map(key => {
15082
- const item = items[key];
15083
-
15084
- if (item.children) {
15085
- const smItem = item;
15086
- return /*#__PURE__*/React__default.createElement(Menu$1.SubMenu, {
15087
- title: smItem.caption,
15088
- key: key,
15089
- icon: smItem.icon
15090
- }, Object.keys(smItem.children).map(chKey => {
15091
- const chItem = smItem.children[chKey];
15092
- return /*#__PURE__*/React__default.createElement(Menu$1.Item, {
15093
- key: chKey,
15094
- icon: chItem.icon
15095
- }, chItem.caption);
15096
- }));
15097
- } else {
15098
- const item_ = item;
15099
- return /*#__PURE__*/React__default.createElement(Menu$1.Item, {
15100
- key: key,
15101
- icon: item_.icon
15102
- }, item_.caption);
15103
- }
15104
- }));
15105
- return /*#__PURE__*/React__default.createElement(Dropdown, _extends({
15106
- overlay: menu,
15107
- placement: "bottomCenter"
15108
- }, props), children ? children : /*#__PURE__*/React__default.createElement("div", {
15109
- style: {
15110
- width: '24px',
15111
- cursor: 'pointer'
15112
- },
15113
- onClick: e => e.stopPropagation()
15114
- }, "..."));
15115
- };
15781
+ reader.readAsText(file);
15782
+ break;
15116
15783
 
15117
- const zoomToFit = drawingId => {
15118
- var _getCamera;
15784
+ case 'ArrayBuffer':
15785
+ default:
15786
+ reader.readAsArrayBuffer(file);
15787
+ break;
15788
+ }
15789
+ });
15790
+ }
15791
+ /**
15792
+ * Simple helper functions for file interaction.
15793
+ */
15119
15794
 
15120
- const drawing = getDrawing(drawingId);
15121
- const camApi = (_getCamera = getCamera(drawingId)) == null ? void 0 : _getCamera.api;
15122
15795
 
15123
- if (!drawing || !camApi) {
15124
- return;
15125
- }
15796
+ const FileUtils = {
15797
+ /**
15798
+ * Loads a file from the file system.
15799
+ * It uses @see document and is therefore directly dependent on the DOM.
15800
+ *
15801
+ * @param onLoad The callback.
15802
+ * @param type The content type.
15803
+ */
15804
+ loadFile: (onLoad, type, multiple) => {
15805
+ const handler = event => {
15806
+ if (event.target && event.target.files) {
15807
+ const files = [...event.target.files];
15808
+ const promises = files.map(f => readFile(f, type));
15809
+ Promise.all(promises).then(res => onLoad(res)).catch();
15810
+ event.target.value = '';
15811
+ }
15812
+ };
15126
15813
 
15127
- const {
15128
- structure,
15129
- api: drawingApi
15130
- } = drawing;
15131
- const {
15132
- root,
15133
- currentProduct,
15134
- currentNode
15135
- } = structure;
15136
- let currRoot = currentNode || currentProduct || root;
15814
+ const loaderId = '________buerli-react-cad________';
15815
+ const loaderSelector = `#${loaderId}`;
15816
+ let loader = document.querySelector(loaderSelector);
15137
15817
 
15138
- if (currentProduct && structure.tree[currentProduct].class === 'CC_Part') {
15139
- currRoot = currentProduct;
15140
- }
15818
+ if (!loader || !loader.onchange) {
15819
+ loader = document.createElement('input');
15820
+ loader.id = loaderId;
15821
+ loader.type = 'file';
15822
+ loader.multiple = multiple || false;
15823
+ loader.style.display = 'none';
15824
+ document.body.appendChild(loader);
15825
+ }
15141
15826
 
15142
- const bounds = drawingApi.structure.calculateProductBounds(currRoot);
15143
- camApi.setZoom('fit', bounds);
15144
- };
15827
+ if (loader) {
15828
+ loader.onchange = handler;
15829
+ loader.click();
15830
+ }
15831
+ },
15832
+ exportNode: async (drawingId, objectId, type = 'of1') => {
15833
+ var _members$productId;
15145
15834
 
15146
- function ownKeys$5(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
15835
+ const structure = getDrawing(drawingId).structure;
15836
+ const tree = structure.tree;
15837
+ const isRoot = objectId === structure.root;
15838
+ const productId = ((_members$productId = tree[objectId].members.productId) == null ? void 0 : _members$productId.value) || objectId;
15839
+ const name = tree[productId].name;
15840
+ const data = isRoot ? await ccAPI.baseModeler.save(drawingId, type) : await ccAPI.assemblyBuilder.exportNode(drawingId, objectId, type);
15147
15841
 
15148
- function _objectSpread$5(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$5(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$5(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
15149
- const appApi = (set, get) => ({
15150
- assemblyTree: {
15151
- startProdEditing: (drawingId, objId) => {
15152
- set(state => {
15153
- let res = [];
15154
- const curNode = api.getState().drawing.refs[drawingId].structure.currentNode;
15155
- res = state.assemblyTree.prodStack;
15156
- curNode && res.push(curNode);
15157
- return _objectSpread$5(_objectSpread$5({}, state), {}, {
15158
- assemblyTree: {
15159
- prodStack: [...res]
15160
- }
15161
- });
15162
- });
15163
- ccAPI.assemblyBuilder.setCurrentNode(drawingId, objId).then(() => zoomToFit(drawingId)).catch();
15164
- },
15165
- goBack: drawingId => {
15166
- const prodStack = get().assemblyTree.prodStack;
15167
- const prevProd = prodStack[prodStack.length - 1];
15168
- if (!prevProd) return;
15169
- set(state => {
15170
- const res = state.assemblyTree.prodStack;
15171
- res.pop();
15172
- return _objectSpread$5(_objectSpread$5({}, state), {}, {
15173
- assemblyTree: {
15174
- prodStack: [...res]
15175
- }
15176
- });
15177
- });
15178
- ccAPI.assemblyBuilder.setCurrentNode(drawingId, prevProd).then(() => zoomToFit(drawingId)).catch();
15179
- },
15180
- clearProdStack: () => {
15181
- set(state => _objectSpread$5(_objectSpread$5({}, state), {}, {
15182
- assemblyTree: {
15183
- prodStack: []
15184
- }
15842
+ if (data) {
15843
+ const link = document.createElement('a');
15844
+ link.href = window.URL.createObjectURL(new Blob([data], {
15845
+ type: 'application/octet-stream'
15185
15846
  }));
15847
+ link.download = `${name}.${type}`;
15848
+ link.click();
15186
15849
  }
15187
15850
  }
15188
- });
15189
-
15190
- const createAppState = (set, get) => ({
15191
- assemblyTree: {
15192
- prodStack: []
15193
- },
15194
- api: appApi(set, get)
15195
- });
15196
-
15197
- const CADApi = vanilla((set, get) => createAppState(set, get));
15198
- const useCADStore = create(CADApi);
15199
- const getCADState = CADApi.getState;
15851
+ };
15200
15852
 
15201
15853
  function useMenuItems$3(drawingId, prodId, setEditName, pluginId) {
15202
15854
  const isCurrent = useDrawing(drawingId, d => d.structure.currentProduct === prodId);
@@ -15274,43 +15926,8 @@ function useMenuItems$3(drawingId, prodId, setEditName, pluginId) {
15274
15926
  return res;
15275
15927
  }
15276
15928
 
15277
- const NameEdit = ({
15278
- drawingId,
15279
- objId,
15280
- setEditName,
15281
- name
15282
- }) => {
15283
- const ref = React__default.useRef(null);
15284
- const onEnter = React__default.useCallback(async e => {
15285
- if (e.target.value !== '') {
15286
- await ccAPI.common.setObjectName(drawingId, objId, e.target.value);
15287
- }
15288
-
15289
- setEditName(false);
15290
- }, [drawingId, objId, setEditName]);
15291
- const onKeyPress = React__default.useCallback(e => {
15292
- if (e.key !== 'Escape') return;
15293
- setEditName(false);
15294
- }, [setEditName]);
15295
- React__default.useEffect(() => {
15296
- var _ref$current;
15297
-
15298
- (_ref$current = ref.current) == null ? void 0 : _ref$current.focus({
15299
- cursor: 'all'
15300
- });
15301
- }, []);
15302
- return /*#__PURE__*/React__default.createElement(Input, {
15303
- ref: ref,
15304
- onPressEnter: onEnter,
15305
- defaultValue: name,
15306
- size: "small",
15307
- onKeyDown: onKeyPress,
15308
- onBlur: () => setEditName(false)
15309
- });
15310
- };
15311
-
15312
15929
  const {
15313
- Text: Text$2
15930
+ Text: Text$1
15314
15931
  } = Typography; // TODO: use Name from Feature.tsx
15315
15932
 
15316
15933
  const Name = ({
@@ -15319,7 +15936,7 @@ const Name = ({
15319
15936
  strong,
15320
15937
  onClick
15321
15938
  }) => {
15322
- return /*#__PURE__*/React__default.createElement(Text$2, {
15939
+ return /*#__PURE__*/React__default.createElement(Text$1, {
15323
15940
  disabled: disabled,
15324
15941
  strong: strong,
15325
15942
  style: {
@@ -15407,7 +16024,7 @@ const NewProd = ({
15407
16024
  ref: inputRef,
15408
16025
  suffix: /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Space, null, /*#__PURE__*/React__default.createElement(InputButton, {
15409
16026
  type: "apply",
15410
- onClick: () => createProd() && setCreateMode(false)
16027
+ onClick: () => setCreateMode(false)
15411
16028
  }), /*#__PURE__*/React__default.createElement(InputButton, {
15412
16029
  type: "cancel",
15413
16030
  onClick: () => setCreateMode(false)
@@ -15444,13 +16061,16 @@ const ProdTable = ({
15444
16061
  dataIndex: 'prodId',
15445
16062
  render
15446
16063
  }];
15447
- }, [drawingId, pluginId, setCreateMode]); // ResetselectedProduct when plugin is closed
16064
+ }, [drawingId, pluginId, setCreateMode]); // Reset selectedProduct when plugin is closed
15448
16065
 
15449
16066
  React__default.useEffect(() => {
15450
- return () => set({
15451
- selectedProduct: null
15452
- });
15453
- }, [set]);
16067
+ return () => {
16068
+ const plugin = getPlugin(drawingId, pluginId);
16069
+ plugin && plugin.set({
16070
+ selectedProduct: null
16071
+ });
16072
+ };
16073
+ }, [drawingId, pluginId]);
15454
16074
  const keyHandler = React__default.useCallback(e => {
15455
16075
  if (e.key === 'Escape') {
15456
16076
  set({
@@ -15919,6 +16539,25 @@ const useIsDisabled = (drawingId, featureId) => {
15919
16539
  return featureIndex > rollbackBarIndex || actFeatIdx >= 0 && actFeatIdx < featureIndex;
15920
16540
  };
15921
16541
 
16542
+ /**
16543
+ * Validator for FeatureList component. Checks drawing and currentProduct existance.
16544
+ *
16545
+ * @param drawingId
16546
+ * @returns
16547
+ */
16548
+
16549
+ const FeatureListValidator = ({
16550
+ drawingId,
16551
+ children
16552
+ }) => {
16553
+ const warnings = {};
16554
+ useDrawingVerifier(drawingId, warnings);
16555
+ useRootOrProdVerifier(drawingId, warnings);
16556
+ return /*#__PURE__*/React__default.createElement(ErrorBoundary, {
16557
+ warnings: warnings
16558
+ }, children);
16559
+ };
16560
+
15922
16561
  /**
15923
16562
  * Goal of this component is to manage visibility of individual features when interacting with RollbackBar
15924
16563
  * TODO: change the component name?
@@ -15955,8 +16594,6 @@ const VisibilityController = ({
15955
16594
  const FtVisibilityControllerImpl = ({
15956
16595
  drawingId
15957
16596
  }) => {
15958
- var _operationSequence$ch;
15959
-
15960
16597
  const activeSelId = useDrawing(drawingId, d => d.selection.active);
15961
16598
  const featuresToHide = React__default.useRef([]);
15962
16599
  React__default.useEffect(() => {
@@ -15985,15 +16622,7 @@ const FtVisibilityControllerImpl = ({
15985
16622
  };
15986
16623
  }, [drawingId, activeSelId]);
15987
16624
  const curPartId = useDrawing(drawingId, d => d.structure.currentProduct || d.structure.root);
15988
- const {
15989
- operationSequence
15990
- } = useRollbackBar(drawingId, curPartId);
15991
- const tree = getDrawing(drawingId).structure.tree;
15992
- const features = operationSequence == null ? void 0 : (_operationSequence$ch = operationSequence.children) == null ? void 0 : _operationSequence$ch.map(id => {
15993
- var _tree$id, _tree$id$members, _tree$id$members$refO;
15994
-
15995
- return (_tree$id = tree[id]) == null ? void 0 : (_tree$id$members = _tree$id.members) == null ? void 0 : (_tree$id$members$refO = _tree$id$members.refObj) == null ? void 0 : _tree$id$members$refO.value;
15996
- });
16625
+ const features = useFeaturesIds(drawingId, curPartId);
15997
16626
  return features ? /*#__PURE__*/React__default.createElement(React__default.Fragment, null, features.map(id => /*#__PURE__*/React__default.createElement(VisibilityController, {
15998
16627
  key: id,
15999
16628
  drawingId: drawingId,
@@ -16004,70 +16633,25 @@ const FtVisibilityControllerImpl = ({
16004
16633
  const FtVisibilityController = ({
16005
16634
  drawingId
16006
16635
  }) => {
16007
- return /*#__PURE__*/React__default.createElement(ErrorBoundary, null, /*#__PURE__*/React__default.createElement(FtVisibilityControllerImpl, {
16636
+ return /*#__PURE__*/React__default.createElement(FeatureListValidator, {
16637
+ drawingId: drawingId
16638
+ }, /*#__PURE__*/React__default.createElement(FtVisibilityControllerImpl, {
16008
16639
  drawingId: drawingId
16009
16640
  }));
16010
16641
  };
16011
16642
 
16012
16643
  var FtVisibilityController$1 = FtVisibilityController;
16013
16644
 
16014
- function ownKeys$4(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
16015
-
16016
- function _objectSpread$4(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$4(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$4(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
16017
-
16018
- const Divider = props => {
16019
- return /*#__PURE__*/React__default.createElement(Divider$1, _extends({}, props, {
16020
- style: _objectSpread$4({
16021
- margin: '0'
16022
- }, props.style)
16023
- }));
16024
- };
16645
+ function ownKeys$6(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
16025
16646
 
16026
- const FlexRow = styled.div`
16027
- display: flex;
16028
- flex-direction: row;
16029
- `;
16030
- const FlexReverseRow = styled.div`
16031
- display: flex;
16032
- flex-direction: row-reverse;
16033
- `;
16034
- const Link = styled.a`
16035
- color: #4f4f4f;
16036
- &:hover {
16037
- text-decoration: underline;
16038
- text-decoration-color: #4f4f4f;
16039
- color: #4f4f4f;
16040
- }
16041
- `;
16042
- const HoveredDiv = styled.div`
16043
- width: 100%;
16044
- display: flex;
16045
- justify-content: space-between;
16046
- cursor: default;
16047
- &:hover {
16048
- background-color: #fbfbfb;
16049
- }
16050
- `;
16647
+ function _objectSpread$6(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$6(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$6(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
16051
16648
 
16052
- const {
16053
- Text: Text$1
16054
- } = Typography;
16055
- const EntityName = ({
16056
- name,
16057
- disabled,
16058
- strong,
16059
- onClick,
16060
- onMouseEnter,
16061
- onMouseLeave
16062
- }) => {
16063
- return /*#__PURE__*/React__default.createElement(Link, {
16064
- onClick: onClick,
16065
- onMouseEnter: onMouseEnter,
16066
- onMouseLeave: onMouseLeave
16067
- }, /*#__PURE__*/React__default.createElement(Text$1, {
16068
- disabled: disabled,
16069
- strong: strong
16070
- }, name));
16649
+ const Divider = props => {
16650
+ return /*#__PURE__*/React__default.createElement(Divider$1, _extends({}, props, {
16651
+ style: _objectSpread$6({
16652
+ margin: '0'
16653
+ }, props.style)
16654
+ }));
16071
16655
  };
16072
16656
 
16073
16657
  function useMenuItems$2(drawingId, featureId, isActive, setEditName) {
@@ -16093,35 +16677,92 @@ function useMenuItems$2(drawingId, featureId, isActive, setEditName) {
16093
16677
  }, [drawingId, featureId, isActive, setEditName]);
16094
16678
  }
16095
16679
 
16096
- function useIsCustom(drawingId, featureId) {
16680
+ function useIsCustom(drawingId, featureRefId) {
16681
+ const curProduct = useDrawing(drawingId, d => d.structure.currentProduct);
16682
+ const opSeqId = useOperationSequence(drawingId, curProduct);
16683
+ const opSeqChildren = useDrawing(drawingId, d => {
16684
+ var _d$structure$tree;
16685
+
16686
+ return (_d$structure$tree = d.structure.tree[opSeqId || -1]) == null ? void 0 : _d$structure$tree.children;
16687
+ }) || []; // First 7 elements in operationSequence are features created by default (origin, x,y,z axes and planes) => they're not custom
16688
+
16689
+ return opSeqChildren.indexOf(featureRefId) > 6;
16690
+ }
16691
+
16692
+ function usePrecheckErrorId(drawingId, featureId) {
16097
16693
  const curProduct = useDrawing(drawingId, d => d.structure.currentProduct);
16098
16694
  const opSeqId = useOperationSequence(drawingId, curProduct) || -1;
16099
- const opSeqChildren = useDrawing(drawingId, d => d.structure.tree[opSeqId].children || []);
16100
- const referedObjs = React__default.useMemo(() => {
16101
- return opSeqChildren.map(refId => {
16102
- const ref = getDrawing(drawingId).structure.tree[refId];
16103
- return ref.members.refObj.value;
16104
- });
16105
- }, [opSeqChildren, drawingId]); // First 7 elements in operationSequens are features created by default (origin, x,y,z axes and planes) => they're not custom
16695
+ const opSeqChildren = useDrawing(drawingId, d => {
16696
+ var _d$structure$tree$opS;
16697
+
16698
+ return (_d$structure$tree$opS = d.structure.tree[opSeqId]) == null ? void 0 : _d$structure$tree$opS.children;
16699
+ }) || [];
16700
+ const refId = opSeqChildren.find(chId => {
16701
+ var _ref_$members;
16702
+
16703
+ const ref_ = getDrawing(drawingId).structure.tree[chId];
16704
+ return featureId === (ref_ == null ? void 0 : (_ref_$members = ref_.members) == null ? void 0 : _ref_$members.refObj.value);
16705
+ });
16706
+ const refChildren = useDrawing(drawingId, d => {
16707
+ var _d$structure$tree2;
16708
+
16709
+ return (_d$structure$tree2 = d.structure.tree[refId || -1]) == null ? void 0 : _d$structure$tree2.children;
16710
+ }) || [];
16711
+ const errorId = refChildren.find(chId => {
16712
+ var _getDrawing$structure;
16713
+
16714
+ return ((_getDrawing$structure = getDrawing(drawingId).structure.tree[chId]) == null ? void 0 : _getDrawing$structure.class) === CCClasses.BMError;
16715
+ }) || null;
16716
+ return errorId;
16717
+ }
16718
+
16719
+ const ErrorWrapper = styled.div`
16720
+ cursor: pointer;
16721
+ margin-right: 4px;
16722
+ `;
16723
+
16724
+ const PrecheckError = ({
16725
+ drawingId,
16726
+ errorId
16727
+ }) => {
16728
+ var _error$members;
16729
+
16730
+ const error = useDrawing(drawingId, d => d.structure.tree[errorId]);
16731
+ const title = (error == null ? void 0 : (_error$members = error.members) == null ? void 0 : _error$members.errorMessage.value) || '';
16732
+ return /*#__PURE__*/React__default.createElement(ErrorWrapper, null, /*#__PURE__*/React__default.createElement(Tooltip, {
16733
+ title: title
16734
+ }, /*#__PURE__*/React__default.createElement(ExclamationCircleTwoTone, {
16735
+ twoToneColor: "#ff5f5f"
16736
+ })));
16737
+ };
16106
16738
 
16107
- return referedObjs.indexOf(featureId) > 6;
16739
+ function useHasView(drawingId, featureId) {
16740
+ const [hasGraphics, setHasGraphics] = React__default.useState(false);
16741
+ const ftClass = useDrawing(drawingId, d => d.structure.tree[featureId].class);
16742
+ useFeaturePluginDef(ftClass, plugin => setHasGraphics(Boolean(plugin == null ? void 0 : plugin.View)));
16743
+ return hasGraphics;
16108
16744
  }
16109
16745
 
16110
16746
  const Feature = ({
16111
16747
  drawingId,
16112
- featureId
16748
+ featureRefId
16113
16749
  }) => {
16114
- const name = useDrawing(drawingId, d => d.structure.tree[featureId].name);
16115
- const visible = useDrawing(drawingId, d => d.plugin.visible.indexOf(featureId) >= 0);
16116
- const view = useDrawing(drawingId, d => {
16117
- var _d$plugin$refs$featur;
16750
+ const featureId = useDrawing(drawingId, d => {
16751
+ var _d$structure$tree$fea, _d$structure$tree$fea2;
16752
+
16753
+ return (_d$structure$tree$fea = d.structure.tree[featureRefId]) == null ? void 0 : (_d$structure$tree$fea2 = _d$structure$tree$fea.members) == null ? void 0 : _d$structure$tree$fea2.refObj.value;
16754
+ });
16755
+ const name = useDrawing(drawingId, d => {
16756
+ var _d$structure$tree$fea3;
16118
16757
 
16119
- return (_d$plugin$refs$featur = d.plugin.refs[featureId]) == null ? void 0 : _d$plugin$refs$featur.View;
16758
+ return (_d$structure$tree$fea3 = d.structure.tree[featureId]) == null ? void 0 : _d$structure$tree$fea3.name;
16120
16759
  });
16121
- const hasGraphics = Boolean(view);
16760
+ const visible = useDrawing(drawingId, d => d.plugin.visible.indexOf(featureId) >= 0);
16761
+ const hasGraphics = useHasView(drawingId, featureId);
16122
16762
  const isActive = useDrawing(drawingId, d => d.plugin.active.feature === featureId);
16123
- const isCustom = useIsCustom(drawingId, featureId);
16763
+ const isCustom = useIsCustom(drawingId, featureRefId);
16124
16764
  const disabled = useIsDisabled(drawingId, featureId);
16765
+ const errorId = usePrecheckErrorId(drawingId, featureId);
16125
16766
  const [rename, setRename] = React__default.useState(false);
16126
16767
  const onNameClick = React__default.useCallback(() => {
16127
16768
  !disabled && getDrawing(drawingId).api.plugin.setActiveFeature(featureId);
@@ -16142,6 +16783,7 @@ const Feature = ({
16142
16783
  const pluginApi = getDrawing(drawingId).api.plugin;
16143
16784
  pluginApi.setVisiblePlugin(featureId, !visible);
16144
16785
  }, [drawingId, visible, featureId, disabled, rename]);
16786
+ const [isMenuHovered, setIsMenuHovered] = React__default.useState(false);
16145
16787
  const menuItems = useMenuItems$2(drawingId, featureId, isActive, setRename);
16146
16788
  const eyeComponent = React__default.useMemo(() => {
16147
16789
  if (!hasGraphics) return /*#__PURE__*/React__default.createElement("div", {
@@ -16164,51 +16806,20 @@ const Feature = ({
16164
16806
  });
16165
16807
  }, [hasGraphics, visible, disabled, onEyeClick]);
16166
16808
  return /*#__PURE__*/React__default.createElement(HoveredDiv, {
16167
- style: {
16168
- borderBottom: '1px solid #f0f0f0',
16169
- padding: '4px 10px'
16170
- },
16809
+ hovered: isMenuHovered,
16810
+ bordered: true,
16171
16811
  title: String(featureId)
16172
- }, /*#__PURE__*/React__default.createElement(Space, null, eyeComponent, nameComponent), isCustom && /*#__PURE__*/React__default.createElement(Menu, {
16173
- items: menuItems
16174
- }));
16175
- };
16176
-
16177
- function useFeaturesIds(drawingId, curNodeId) {
16178
- const curClass = useDrawing(drawingId, d => d.structure.tree[curNodeId].class);
16179
- const prodId = useDrawing(drawingId, d => {
16180
- if (curClass === CCClasses.CCProductReference || curClass === CCClasses.CCProductReferenceET) {
16181
- const node = d.structure.tree[curNodeId];
16182
- return node.members.productId.value;
16812
+ }, /*#__PURE__*/React__default.createElement(Space, {
16813
+ style: {
16814
+ flex: 1
16183
16815
  }
16184
-
16185
- return curNodeId;
16186
- });
16187
- const featuresIds = useDrawing(drawingId, d => {
16188
- var _d$structure$tree$pro;
16189
-
16190
- return ((_d$structure$tree$pro = d.structure.tree[prodId]) == null ? void 0 : _d$structure$tree$pro.features) || [];
16191
- });
16192
- return featuresIds;
16193
- }
16194
-
16195
- /**
16196
- * Validator for FeatureList component. Checks drawing and currentProduct existance.
16197
- *
16198
- * @param drawingId
16199
- * @returns
16200
- */
16201
-
16202
- const FeatureListValidator = ({
16203
- drawingId,
16204
- children
16205
- }) => {
16206
- const warnings = {};
16207
- useDrawingVerifier(drawingId, warnings);
16208
- useRootOrProdVerifier(drawingId, warnings);
16209
- return /*#__PURE__*/React__default.createElement(ErrorBoundary, {
16210
- warnings: warnings
16211
- }, children);
16816
+ }, eyeComponent, nameComponent), errorId && /*#__PURE__*/React__default.createElement(PrecheckError, {
16817
+ drawingId: drawingId,
16818
+ errorId: errorId
16819
+ }), isCustom && /*#__PURE__*/React__default.createElement(Menu, {
16820
+ items: menuItems,
16821
+ onVisibleChange: setIsMenuHovered
16822
+ }));
16212
16823
  };
16213
16824
 
16214
16825
  const _excluded$1 = ["children"];
@@ -16222,7 +16833,7 @@ const SortableCont = SortableContainer(_ref => {
16222
16833
  });
16223
16834
  const SortableItem = SortableElement(({
16224
16835
  drawingId,
16225
- featureId,
16836
+ featureRefId,
16226
16837
  isRollbackBar
16227
16838
  }) => {
16228
16839
  if (isRollbackBar) return /*#__PURE__*/React__default.createElement("div", {
@@ -16248,36 +16859,53 @@ const SortableItem = SortableElement(({
16248
16859
  }
16249
16860
  }));else return /*#__PURE__*/React__default.createElement(Feature, {
16250
16861
  drawingId: drawingId,
16251
- featureId: featureId
16862
+ featureRefId: featureRefId
16252
16863
  });
16253
16864
  });
16254
16865
 
16255
16866
  const Item$1 = ({
16256
16867
  drawingId,
16257
- featureId
16868
+ featureRefId
16258
16869
  }) => {
16259
16870
  const curPartId = useDrawing(drawingId, d => d.structure.currentProduct || d.structure.root);
16260
- const featuresIds = useFeaturesIds(drawingId, curPartId);
16871
+ const opSeqId = useOperationSequence(drawingId, curPartId);
16872
+ const idx = useDrawing(drawingId, d => {
16873
+ var _d$structure$tree, _d$structure$tree$chi;
16874
+
16875
+ return (_d$structure$tree = d.structure.tree[opSeqId || -1]) == null ? void 0 : (_d$structure$tree$chi = _d$structure$tree.children) == null ? void 0 : _d$structure$tree$chi.indexOf(featureRefId);
16876
+ }) || -1;
16877
+ const featureId = useDrawing(drawingId, d => {
16878
+ var _d$structure$tree$fea, _d$structure$tree$fea2;
16879
+
16880
+ return (_d$structure$tree$fea = d.structure.tree[featureRefId]) == null ? void 0 : (_d$structure$tree$fea2 = _d$structure$tree$fea.members) == null ? void 0 : _d$structure$tree$fea2.refObj.value;
16881
+ });
16261
16882
  const objClass = useDrawing(drawingId, d => {
16262
- var _d$structure$tree$fea;
16883
+ var _d$structure$tree$fea3;
16263
16884
 
16264
- return ((_d$structure$tree$fea = d.structure.tree[featureId]) == null ? void 0 : _d$structure$tree$fea.class) || '';
16885
+ return ((_d$structure$tree$fea3 = d.structure.tree[featureId]) == null ? void 0 : _d$structure$tree$fea3.class) || '';
16265
16886
  });
16266
- const idx = featuresIds.findIndex(fId => fId === featureId);
16887
+ const isFeatureActive = useDrawing(drawingId, d => d.plugin.active.feature !== null) || false;
16267
16888
  const isRollbackBar = objClass === CCClasses.CCRollbackBar;
16889
+ const isDisabled = !isRollbackBar || isFeatureActive;
16268
16890
  return /*#__PURE__*/React__default.createElement(SortableItem, {
16269
16891
  drawingId: drawingId,
16270
- featureId: featureId,
16892
+ featureRefId: featureRefId,
16271
16893
  isRollbackBar: isRollbackBar,
16272
- disabled: !isRollbackBar,
16894
+ disabled: isDisabled,
16273
16895
  index: idx
16274
16896
  });
16275
16897
  };
16276
16898
 
16277
16899
  const List$2 = ({
16278
- featureIds,
16279
16900
  drawingId
16280
16901
  }) => {
16902
+ const curPartId = useDrawing(drawingId, d => d.structure.currentProduct || d.structure.root);
16903
+ const opSeqId = useOperationSequence(drawingId, curPartId);
16904
+ const featureRefIds = useDrawing(drawingId, d => {
16905
+ var _d$structure$tree2;
16906
+
16907
+ return (_d$structure$tree2 = d.structure.tree[opSeqId || -1]) == null ? void 0 : _d$structure$tree2.children;
16908
+ }) || [];
16281
16909
  return /*#__PURE__*/React__default.createElement(SortableCont, {
16282
16910
  helperClass: "row-dragging",
16283
16911
  lockAxis: "y",
@@ -16285,11 +16913,8 @@ const List$2 = ({
16285
16913
  oldIndex,
16286
16914
  newIndex
16287
16915
  }) => {
16288
- var _object$features;
16289
-
16290
16916
  const rootId_ = getDrawing(drawingId).structure.currentProduct;
16291
- const object = getDrawing(drawingId).structure.tree[rootId_];
16292
- const features = (_object$features = object == null ? void 0 : object.features) != null ? _object$features : [];
16917
+ const features = getFeaturesIds(drawingId, rootId_);
16293
16918
  const offset = 4;
16294
16919
  const move = ccAPI.feature.rollback.calculateMovement(oldIndex, newIndex, features, offset);
16295
16920
 
@@ -16299,30 +16924,19 @@ const List$2 = ({
16299
16924
  ccAPI.feature.rollback.moveBefore(drawingId, move.featureId).catch();
16300
16925
  }
16301
16926
  }
16302
- }, featureIds.map(fId => /*#__PURE__*/React__default.createElement(Item$1, {
16303
- key: fId,
16927
+ }, featureRefIds.map(refId => /*#__PURE__*/React__default.createElement(Item$1, {
16928
+ key: refId,
16304
16929
  drawingId: drawingId,
16305
- featureId: fId
16930
+ featureRefId: refId
16306
16931
  })));
16307
16932
  };
16308
16933
 
16309
- const FeatureListImpl = ({
16310
- drawingId
16311
- }) => {
16312
- const curPartId = useDrawing(drawingId, d => d.structure.currentProduct || d.structure.root);
16313
- const featuresIds = useFeaturesIds(drawingId, curPartId);
16314
- return /*#__PURE__*/React__default.createElement(List$2, {
16315
- drawingId: drawingId,
16316
- featureIds: featuresIds
16317
- });
16318
- };
16319
-
16320
16934
  const FeatureList = ({
16321
16935
  drawingId
16322
16936
  }) => {
16323
16937
  return /*#__PURE__*/React__default.createElement(FeatureListValidator, {
16324
16938
  drawingId: drawingId
16325
- }, /*#__PURE__*/React__default.createElement(FeatureListImpl, {
16939
+ }, /*#__PURE__*/React__default.createElement(List$2, {
16326
16940
  drawingId: drawingId
16327
16941
  }));
16328
16942
  };
@@ -16348,35 +16962,6 @@ function useMenuItems$1(drawingId, objectId, setRename) {
16348
16962
  }, [drawingId, objectId, setRename]);
16349
16963
  }
16350
16964
 
16351
- const Indent = () => {
16352
- return /*#__PURE__*/React__default.createElement("span", {
16353
- className: "ant-tree-indent"
16354
- }, /*#__PURE__*/React__default.createElement("span", {
16355
- className: "ant-tree-indent-unit"
16356
- }));
16357
- };
16358
- const Indents = ({
16359
- level
16360
- }) => {
16361
- const arr = Array.from(Array(level).keys());
16362
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, arr.map(i => /*#__PURE__*/React__default.createElement(Indent, {
16363
- key: i
16364
- })));
16365
- };
16366
- const CollapseButton = ({
16367
- collapsed,
16368
- onClick
16369
- }) => {
16370
- return /*#__PURE__*/React__default.createElement("span", {
16371
- className: "ant-tree-switcher",
16372
- onClick: onClick
16373
- }, /*#__PURE__*/React__default.createElement("span", {
16374
- role: "img",
16375
- "aria-label": "caret-down",
16376
- className: "anticon anticon-caret-down ant-tree-switcher-icon"
16377
- }, collapsed ? /*#__PURE__*/React__default.createElement(CaretRightOutlined, null) : /*#__PURE__*/React__default.createElement(CaretDownOutlined, null)));
16378
- };
16379
-
16380
16965
  function setProductsHidden(drawingId, prodId, hidden) {
16381
16966
  var _getDrawing$structure;
16382
16967
 
@@ -16425,6 +17010,7 @@ const NodeTitle = ({
16425
17010
  const referedObj = useDrawing(drawingId, d => d.structure.tree[referedId]);
16426
17011
  const name = referedObj.name;
16427
17012
  const [rename, setRename] = React__default.useState(false);
17013
+ const [isMenuHovered, setIsMenuHovered] = React__default.useState(false);
16428
17014
  const menuItems = useMenuItems$1(drawingId, refId, setRename);
16429
17015
  const nameComponent = rename ? /*#__PURE__*/React__default.createElement(NameEdit, {
16430
17016
  drawingId: drawingId,
@@ -16437,11 +17023,14 @@ const NodeTitle = ({
16437
17023
  onClick: onClick,
16438
17024
  name: name
16439
17025
  }));
16440
- return /*#__PURE__*/React__default.createElement(HoveredDiv, null, /*#__PURE__*/React__default.createElement(Space, null, /*#__PURE__*/React__default.createElement(EyeIcon, {
17026
+ return /*#__PURE__*/React__default.createElement(HoveredDiv, {
17027
+ hovered: isMenuHovered
17028
+ }, /*#__PURE__*/React__default.createElement(Space, null, /*#__PURE__*/React__default.createElement(EyeIcon, {
16441
17029
  drawingId: drawingId,
16442
17030
  refId: refId
16443
17031
  }), referedObj.class === CCClasses.CCAssembly ? /*#__PURE__*/React__default.createElement(AppstoreOutlined, null) : /*#__PURE__*/React__default.createElement(FileOutlined, null), nameComponent), /*#__PURE__*/React__default.createElement(Menu, {
16444
- items: menuItems
17032
+ items: menuItems,
17033
+ onVisibleChange: setIsMenuHovered
16445
17034
  }));
16446
17035
  };
16447
17036
 
@@ -16537,6 +17126,7 @@ const AssemblyTreeHeader = ({
16537
17126
  const currNode = useCurrentNode(drawingId);
16538
17127
  const objDetails = useObjectDetails(drawingId, (currNode == null ? void 0 : currNode.id) || -1);
16539
17128
  const showBackBtn = React__default.useMemo(() => pStackNotEmpty || !objDetails.isRoot && (objDetails.isAssemblyNode || objDetails.isAssembly), [objDetails.isAssembly, objDetails.isAssemblyNode, objDetails.isRoot, pStackNotEmpty]);
17129
+ const isFeatureActive = useDrawing(drawingId, d => d.plugin.active.feature !== null) || false;
16540
17130
  const name = currProd ? currProd.name : currNode ? currNode.name : '';
16541
17131
  const [rename, setRename] = React__default.useState(false);
16542
17132
  const [showNameChoice, setShowNameChoice] = React__default.useState(false);
@@ -16567,6 +17157,19 @@ const AssemblyTreeHeader = ({
16567
17157
  title: 'Export node as ' + type,
16568
17158
  placement: "right"
16569
17159
  }, type))));
17160
+ const exportComponent = isFeatureActive ? /*#__PURE__*/React__default.createElement(Tooltip$1, {
17161
+ title: "All features should be closed before exporting",
17162
+ placement: "left"
17163
+ }, /*#__PURE__*/React__default.createElement(Button, {
17164
+ icon: /*#__PURE__*/React__default.createElement(ExportOutlined, null),
17165
+ size: "small",
17166
+ disabled: true
17167
+ })) : /*#__PURE__*/React__default.createElement(Dropdown, {
17168
+ overlay: menu
17169
+ }, /*#__PURE__*/React__default.createElement(Button, {
17170
+ icon: /*#__PURE__*/React__default.createElement(ExportOutlined, null),
17171
+ size: "small"
17172
+ }));
16570
17173
  const nameComponent = rename ? /*#__PURE__*/React__default.createElement(NameEdit, {
16571
17174
  drawingId: drawingId,
16572
17175
  objId: (currProd == null ? void 0 : currProd.id) || -1,
@@ -16581,12 +17184,7 @@ const AssemblyTreeHeader = ({
16581
17184
  size: "small",
16582
17185
  icon: /*#__PURE__*/React__default.createElement(LeftOutlined, null),
16583
17186
  onClick: () => api.assemblyTree.goBack(drawingId)
16584
- }), nameComponent), /*#__PURE__*/React__default.createElement(Space, null, /*#__PURE__*/React__default.createElement(Dropdown, {
16585
- overlay: menu
16586
- }, /*#__PURE__*/React__default.createElement(Button, {
16587
- icon: /*#__PURE__*/React__default.createElement(ExportOutlined, null),
16588
- size: "small"
16589
- })), mode === EditMode.Assembly && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Tooltip$1, {
17187
+ }), nameComponent), /*#__PURE__*/React__default.createElement(Space, null, exportComponent, mode === EditMode.Assembly && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Tooltip$1, {
16590
17188
  title: "Convert to subassembly"
16591
17189
  }, /*#__PURE__*/React__default.createElement(Button, {
16592
17190
  onClick: () => setShowNameChoice(true),
@@ -16767,6 +17365,7 @@ const Entity = ({
16767
17365
  const isActive = useDrawing(drawingId, d => d.plugin.active.feature === constraintId);
16768
17366
  const hover = useComponentInteraction(drawingId, state => state.api);
16769
17367
  const [rename, setRename] = React__default.useState(false);
17368
+ const [isMenuHovered, setIsMenuHovered] = React__default.useState(false);
16770
17369
  const menuItems = useMenuItems$2(drawingId, constraintId, isActive, setRename);
16771
17370
  const onNameClick = React__default.useCallback(() => {
16772
17371
  getDrawing(drawingId).api.plugin.setActiveFeature(constraintId);
@@ -16790,12 +17389,11 @@ const Entity = ({
16790
17389
  onMouseLeave: onMouseLeave
16791
17390
  });
16792
17391
  return /*#__PURE__*/React__default.createElement(HoveredDiv, {
16793
- style: {
16794
- borderBottom: '1px solid #f0f0f0',
16795
- padding: '4px 10px'
16796
- }
17392
+ hovered: isMenuHovered,
17393
+ bordered: true
16797
17394
  }, /*#__PURE__*/React__default.createElement(Space, null, nameComponent), /*#__PURE__*/React__default.createElement(Menu, {
16798
- items: menuItems
17395
+ items: menuItems,
17396
+ onVisibleChange: setIsMenuHovered
16799
17397
  }));
16800
17398
  }; // TODO: Create external component
16801
17399
 
@@ -16929,7 +17527,8 @@ const ColorPicker = ({
16929
17527
  const geomApi = getDrawing(drawingId).api.geometry;
16930
17528
  geomApi.setConfig(solidId, {
16931
17529
  meshes: {
16932
- color: undefined
17530
+ color: undefined,
17531
+ opacity: undefined
16933
17532
  }
16934
17533
  });
16935
17534
  setShowPicker(false);
@@ -16939,7 +17538,8 @@ const ColorPicker = ({
16939
17538
  const geomApi = getDrawing(drawingId).api.geometry;
16940
17539
  geomApi.setConfig(solidId, {
16941
17540
  meshes: {
16942
- color: undefined
17541
+ color: undefined,
17542
+ opacity: undefined
16943
17543
  }
16944
17544
  });
16945
17545
  setUColor({
@@ -17045,12 +17645,11 @@ const Solid = ({
17045
17645
  }) || -1;
17046
17646
  const ccSolid = useDrawing(drawingId, d => d.structure.tree[solidOwner]);
17047
17647
  const [rename, setRename] = React__default.useState(false);
17648
+ const [isMenuHovered, setIsMenuHovered] = React__default.useState(false);
17048
17649
  const menuItems = useMenuItems(setRename);
17049
17650
  return /*#__PURE__*/React__default.createElement(HoveredDiv, {
17050
- style: {
17051
- borderBottom: '1px solid #f0f0f0',
17052
- padding: '4px 10px'
17053
- }
17651
+ hovered: isMenuHovered,
17652
+ bordered: true
17054
17653
  }, /*#__PURE__*/React__default.createElement(Space, null, /*#__PURE__*/React__default.createElement(EyeComponent, {
17055
17654
  drawingId: drawingId,
17056
17655
  solidId: solidId
@@ -17063,7 +17662,8 @@ const Solid = ({
17063
17662
  drawingId: drawingId,
17064
17663
  solidId: solidId
17065
17664
  }), /*#__PURE__*/React__default.createElement(Menu, {
17066
- items: menuItems
17665
+ items: menuItems,
17666
+ onVisibleChange: setIsMenuHovered
17067
17667
  })));
17068
17668
  }; // TODO: Create external component
17069
17669
 
@@ -17212,9 +17812,9 @@ const Spinner = styled.div`
17212
17812
  transform: translateZ(0);
17213
17813
  `;
17214
17814
 
17215
- function ownKeys$3(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
17815
+ function ownKeys$5(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
17216
17816
 
17217
- function _objectSpread$3(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$3(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$3(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
17817
+ function _objectSpread$5(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$5(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$5(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
17218
17818
  const LoadingWrapper = styled.div`
17219
17819
  position: absolute;
17220
17820
  display: flex;
@@ -17235,7 +17835,7 @@ const LoadingScreen = ({
17235
17835
  children
17236
17836
  }) => {
17237
17837
  return /*#__PURE__*/React__default.createElement("div", {
17238
- style: _objectSpread$3(_objectSpread$3({}, style), {}, {
17838
+ style: _objectSpread$5(_objectSpread$5({}, style), {}, {
17239
17839
  position: 'relative'
17240
17840
  })
17241
17841
  }, isLoading && /*#__PURE__*/React__default.createElement(LoadingWrapper, null, /*#__PURE__*/React__default.createElement(Spinner, null), /*#__PURE__*/React__default.createElement("div", null, "Loading...")), children);
@@ -17379,9 +17979,9 @@ const useResize = (x, y, width, height, onResize) => {
17379
17979
 
17380
17980
  const _excluded = ["id", "modalState", "dispatch", "visible", "children", "title", "initialWidth", "initialHeight", "initialX", "initialY", "resizable", "minPosition", "maxPosition"];
17381
17981
 
17382
- function ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
17982
+ function ownKeys$4(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
17383
17983
 
17384
- function _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$2(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
17984
+ function _objectSpread$4(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$4(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$4(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
17385
17985
  const modalStyle = {
17386
17986
  margin: 0,
17387
17987
  paddingBottom: 0,
@@ -17451,7 +18051,7 @@ function DraggableModalInnerNonMemo(_ref) {
17451
18051
  width,
17452
18052
  height
17453
18053
  } = modalState;
17454
- const style = useMemo(() => _objectSpread$2(_objectSpread$2({}, modalStyle), {}, {
18054
+ const style = useMemo(() => _objectSpread$4(_objectSpread$4({}, modalStyle), {}, {
17455
18055
  top: y,
17456
18056
  left: x,
17457
18057
  height: resizable ? height : 'auto'
@@ -17461,14 +18061,14 @@ function DraggableModalInnerNonMemo(_ref) {
17461
18061
  type: 'focus',
17462
18062
  id
17463
18063
  }), [id, dispatch]);
17464
- const onDragWithID = useCallback(args => dispatch(_objectSpread$2(_objectSpread$2({
18064
+ const onDragWithID = useCallback(args => dispatch(_objectSpread$4(_objectSpread$4({
17465
18065
  type: 'drag',
17466
18066
  id
17467
18067
  }, args), {}, {
17468
18068
  minPosition,
17469
18069
  maxPosition
17470
18070
  })), [dispatch, id, minPosition, maxPosition]);
17471
- const onResizeWithID = useCallback(args => dispatch(_objectSpread$2({
18071
+ const onResizeWithID = useCallback(args => dispatch(_objectSpread$4({
17472
18072
  type: 'resize',
17473
18073
  id
17474
18074
  }, args)), [dispatch, id]);
@@ -17507,9 +18107,9 @@ const getWindowSize = () => ({
17507
18107
 
17508
18108
  const clamp = (min, max, value) => Math.max(min, Math.min(max, value));
17509
18109
 
17510
- function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
18110
+ function ownKeys$3(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
17511
18111
 
17512
- function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
18112
+ function _objectSpread$3(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$3(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$3(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
17513
18113
 
17514
18114
  const mapObject = (o, f) => Object.assign({}, ...Object.keys(o).map(k => ({
17515
18115
  [k]: f(o[k])
@@ -17609,10 +18209,10 @@ const draggableModalReducer = (state, action) => {
17609
18209
  switch (action.type) {
17610
18210
  case 'resize':
17611
18211
  const size = clampResize(state.windowSize.width, state.windowSize.height, action.x, action.y, action.width, action.height);
17612
- return _objectSpread$1(_objectSpread$1({}, state), {}, {
18212
+ return _objectSpread$3(_objectSpread$3({}, state), {}, {
17613
18213
  maxZIndex: getNextZIndex(state, action.id),
17614
- modals: _objectSpread$1(_objectSpread$1({}, state.modals), {}, {
17615
- [action.id]: _objectSpread$1(_objectSpread$1(_objectSpread$1({}, state.modals[action.id]), size), {}, {
18214
+ modals: _objectSpread$3(_objectSpread$3({}, state.modals), {}, {
18215
+ [action.id]: _objectSpread$3(_objectSpread$3(_objectSpread$3({}, state.modals[action.id]), size), {}, {
17616
18216
  zIndex: getNextZIndex(state, action.id)
17617
18217
  })
17618
18218
  })
@@ -17620,10 +18220,10 @@ const draggableModalReducer = (state, action) => {
17620
18220
 
17621
18221
  case 'drag':
17622
18222
  const modal = state.modals[action.id];
17623
- return _objectSpread$1(_objectSpread$1({}, state), {}, {
18223
+ return _objectSpread$3(_objectSpread$3({}, state), {}, {
17624
18224
  maxZIndex: getNextZIndex(state, action.id),
17625
- modals: _objectSpread$1(_objectSpread$1({}, state.modals), {}, {
17626
- [action.id]: _objectSpread$1(_objectSpread$1(_objectSpread$1({}, state.modals[action.id]), clampDrag(action.x, action.y, state.modals[action.id].width || 0, state.modals[action.id].height || 0, modal.maxPosition.x ? Math.min(modal.maxPosition.x, state.windowSize.width) : state.windowSize.width, modal.maxPosition.y ? Math.min(modal.maxPosition.y, state.windowSize.height) : state.windowSize.height, ((_action$minPosition = action.minPosition) == null ? void 0 : _action$minPosition.x) || 0, ((_action$minPosition2 = action.minPosition) == null ? void 0 : _action$minPosition2.y) || 0)), {}, {
18225
+ modals: _objectSpread$3(_objectSpread$3({}, state.modals), {}, {
18226
+ [action.id]: _objectSpread$3(_objectSpread$3(_objectSpread$3({}, state.modals[action.id]), clampDrag(action.x, action.y, state.modals[action.id].width || 0, state.modals[action.id].height || 0, modal.maxPosition.x ? Math.min(modal.maxPosition.x, state.windowSize.width) : state.windowSize.width, modal.maxPosition.y ? Math.min(modal.maxPosition.y, state.windowSize.height) : state.windowSize.height, ((_action$minPosition = action.minPosition) == null ? void 0 : _action$minPosition.x) || 0, ((_action$minPosition2 = action.minPosition) == null ? void 0 : _action$minPosition2.y) || 0)), {}, {
17627
18227
  zIndex: getNextZIndex(state, action.id)
17628
18228
  })
17629
18229
  })
@@ -17643,10 +18243,10 @@ const draggableModalReducer = (state, action) => {
17643
18243
  // modalState.height || 0,
17644
18244
  // )
17645
18245
 
17646
- return _objectSpread$1(_objectSpread$1({}, state), {}, {
18246
+ return _objectSpread$3(_objectSpread$3({}, state), {}, {
17647
18247
  maxZIndex: state.maxZIndex + 1,
17648
- modals: _objectSpread$1(_objectSpread$1({}, state.modals), {}, {
17649
- [action.id]: _objectSpread$1(_objectSpread$1(_objectSpread$1({}, modalState_), position), {}, {
18248
+ modals: _objectSpread$3(_objectSpread$3({}, state.modals), {}, {
18249
+ [action.id]: _objectSpread$3(_objectSpread$3(_objectSpread$3({}, modalState_), position), {}, {
17650
18250
  // ...size,
17651
18251
  zIndex: state.maxZIndex + 1,
17652
18252
  visible: true
@@ -17657,10 +18257,10 @@ const draggableModalReducer = (state, action) => {
17657
18257
 
17658
18258
  case 'focus':
17659
18259
  const modalState = state.modals[action.id];
17660
- return _objectSpread$1(_objectSpread$1({}, state), {}, {
18260
+ return _objectSpread$3(_objectSpread$3({}, state), {}, {
17661
18261
  maxZIndex: state.maxZIndex + 1,
17662
- modals: _objectSpread$1(_objectSpread$1({}, state.modals), {}, {
17663
- [action.id]: _objectSpread$1(_objectSpread$1({}, modalState), {}, {
18262
+ modals: _objectSpread$3(_objectSpread$3({}, state.modals), {}, {
18263
+ [action.id]: _objectSpread$3(_objectSpread$3({}, modalState), {}, {
17664
18264
  zIndex: state.maxZIndex + 1
17665
18265
  })
17666
18266
  })
@@ -17669,9 +18269,9 @@ const draggableModalReducer = (state, action) => {
17669
18269
  case 'hide':
17670
18270
  {
17671
18271
  const modalState_ = state.modals[action.id];
17672
- return _objectSpread$1(_objectSpread$1({}, state), {}, {
17673
- modals: _objectSpread$1(_objectSpread$1({}, state.modals), {}, {
17674
- [action.id]: _objectSpread$1(_objectSpread$1({}, modalState_), {}, {
18272
+ return _objectSpread$3(_objectSpread$3({}, state), {}, {
18273
+ modals: _objectSpread$3(_objectSpread$3({}, state.modals), {}, {
18274
+ [action.id]: _objectSpread$3(_objectSpread$3({}, modalState_), {}, {
17675
18275
  visible: false
17676
18276
  })
17677
18277
  })
@@ -17679,26 +18279,26 @@ const draggableModalReducer = (state, action) => {
17679
18279
  }
17680
18280
 
17681
18281
  case 'mount':
17682
- const initialState = getInitialModalState(_objectSpread$1({}, action.intialState));
17683
- return _objectSpread$1(_objectSpread$1({}, state), {}, {
18282
+ const initialState = getInitialModalState(_objectSpread$3({}, action.intialState));
18283
+ return _objectSpread$3(_objectSpread$3({}, state), {}, {
17684
18284
  maxZIndex: state.maxZIndex + 1,
17685
- modals: _objectSpread$1(_objectSpread$1({}, state.modals), {}, {
17686
- [action.id]: _objectSpread$1(_objectSpread$1(_objectSpread$1({}, state.modals[action.id]), initialState), {}, {
18285
+ modals: _objectSpread$3(_objectSpread$3({}, state.modals), {}, {
18286
+ [action.id]: _objectSpread$3(_objectSpread$3(_objectSpread$3({}, state.modals[action.id]), initialState), {}, {
17687
18287
  zIndex: state.maxZIndex + 1
17688
18288
  })
17689
18289
  })
17690
18290
  });
17691
18291
 
17692
18292
  case 'unmount':
17693
- const modalsClone = _objectSpread$1({}, state.modals);
18293
+ const modalsClone = _objectSpread$3({}, state.modals);
17694
18294
 
17695
18295
  delete modalsClone[action.id];
17696
- return _objectSpread$1(_objectSpread$1({}, state), {}, {
18296
+ return _objectSpread$3(_objectSpread$3({}, state), {}, {
17697
18297
  modals: modalsClone
17698
18298
  });
17699
18299
 
17700
18300
  case 'windowResize':
17701
- return _objectSpread$1(_objectSpread$1({}, state), {}, {
18301
+ return _objectSpread$3(_objectSpread$3({}, state), {}, {
17702
18302
  windowSize: action.size,
17703
18303
  modals: mapObject(state.modals, modalState_ => {
17704
18304
  if (!modalState_.visible) {
@@ -17714,24 +18314,24 @@ const draggableModalReducer = (state, action) => {
17714
18314
  // modalState.height || 0,
17715
18315
  // )
17716
18316
 
17717
- return _objectSpread$1(_objectSpread$1({}, modalState_), position);
18317
+ return _objectSpread$3(_objectSpread$3({}, modalState_), position);
17718
18318
  })
17719
18319
  });
17720
18320
 
17721
18321
  case 'updateMinPosition':
17722
- return _objectSpread$1(_objectSpread$1({}, state), {}, {
17723
- modals: _objectSpread$1(_objectSpread$1({}, state.modals), {}, {
17724
- [action.id]: _objectSpread$1(_objectSpread$1({}, state.modals[action.id]), {}, {
17725
- minPosition: _objectSpread$1(_objectSpread$1({}, state.modals[action.id].minPosition), action.value)
18322
+ return _objectSpread$3(_objectSpread$3({}, state), {}, {
18323
+ modals: _objectSpread$3(_objectSpread$3({}, state.modals), {}, {
18324
+ [action.id]: _objectSpread$3(_objectSpread$3({}, state.modals[action.id]), {}, {
18325
+ minPosition: _objectSpread$3(_objectSpread$3({}, state.modals[action.id].minPosition), action.value)
17726
18326
  })
17727
18327
  })
17728
18328
  });
17729
18329
 
17730
18330
  case 'updateMaxPosition':
17731
- return _objectSpread$1(_objectSpread$1({}, state), {}, {
17732
- modals: _objectSpread$1(_objectSpread$1({}, state.modals), {}, {
17733
- [action.id]: _objectSpread$1(_objectSpread$1({}, state.modals[action.id]), {}, {
17734
- maxPosition: _objectSpread$1(_objectSpread$1({}, state.modals[action.id].maxPosition), action.value)
18331
+ return _objectSpread$3(_objectSpread$3({}, state), {}, {
18332
+ modals: _objectSpread$3(_objectSpread$3({}, state.modals), {}, {
18333
+ [action.id]: _objectSpread$3(_objectSpread$3({}, state.modals[action.id]), {}, {
18334
+ maxPosition: _objectSpread$3(_objectSpread$3({}, state.modals[action.id].maxPosition), action.value)
17735
18335
  })
17736
18336
  })
17737
18337
  });
@@ -17744,9 +18344,9 @@ const draggableModalReducer = (state, action) => {
17744
18344
  var css_248z = "/**\n * NOTE: This is not compiled.\n */\n\n.ant-design-draggable-modal {\n pointer-events: none;\n overflow: hidden !important;\n}\n\n.ant-design-draggable-modal .ant-modal {\n display: flex;\n max-width: none;\n transform-origin: 50% 50% !important;\n}\n\n.ant-design-draggable-modal .ant-modal-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n}\n\n.ant-design-draggable-modal .ant-modal-header {\n flex: 0;\n padding: 0;\n}\n\n.ant-design-draggable-modal .ant-modal-footer {\n flex: 0;\n padding: 16px;\n}\n\n.ant-design-draggable-modal .ant-design-draggable-modal-title {\n cursor: move;\n padding: 16px;\n}\n\n.ant-design-draggable-modal .ant-design-draggable-modal-title::before {\n content: '\\00a0';\n}\n\n.ant-design-draggable-modal .ant-modal-body {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n.ant-design-draggable-modal-resize-handle-inner {\n width: 12px;\n right: 14px;\n border: 2px solid grey;\n height: 12px;\n bottom: 14px;\n position: absolute;\n border-top: 0;\n border-left: 0;\n}\n\n.ant-design-draggable-modal-resize-handle {\n right: -10px;\n width: 44px;\n bottom: -10px;\n cursor: se-resize;\n height: 44px;\n position: absolute;\n}\n";
17745
18345
  styleInject(css_248z);
17746
18346
 
17747
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
18347
+ function ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
17748
18348
 
17749
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
18349
+ function _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$2(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
17750
18350
  const DraggableModal = props => {
17751
18351
  // Get the unique ID of this modal.
17752
18352
  const id = useUID(); // Get modal provider.
@@ -17781,7 +18381,7 @@ const DraggableModal = props => {
17781
18381
  maxPosition
17782
18382
  } = props;
17783
18383
  React.useEffect(() => {
17784
- const value = _objectSpread({
18384
+ const value = _objectSpread$2({
17785
18385
  x: null,
17786
18386
  y: null
17787
18387
  }, maxPosition);
@@ -17796,7 +18396,7 @@ const DraggableModal = props => {
17796
18396
  minPosition
17797
18397
  } = props;
17798
18398
  React.useEffect(() => {
17799
- const value = _objectSpread({
18399
+ const value = _objectSpread$2({
17800
18400
  x: null,
17801
18401
  y: null
17802
18402
  }, minPosition);
@@ -17862,15 +18462,17 @@ const FPluginWindow = ({
17862
18462
  const FeaturePlugin = ({
17863
18463
  drawingId
17864
18464
  }) => {
17865
- const activeFeature = useDrawing(drawingId, d => d.plugin.active.feature);
18465
+ const activeFeature = useDrawing(drawingId, d => d.plugin.active.feature); // Feature plugins are lazy loaded, so it's possible that recently activated feature plugins hasn't been created yet
18466
+
18467
+ const isCreated = usePluginExists(drawingId, activeFeature || -1);
17866
18468
  const name = useDrawing(drawingId, d => {
17867
- if (!activeFeature) return '';
18469
+ if (!activeFeature || !isCreated) return '';
17868
18470
  const objId = d.plugin.refs[activeFeature].objectId;
17869
18471
  const plugin = d.structure.tree[objId];
17870
18472
  return (plugin == null ? void 0 : plugin.name) || '';
17871
18473
  });
17872
18474
  const pluginAPI = getDrawing(drawingId).api.plugin;
17873
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(DraggableModalProvider, null, activeFeature && /*#__PURE__*/React__default.createElement(DraggableModal, {
18475
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(DraggableModalProvider, null, activeFeature && isCreated && /*#__PURE__*/React__default.createElement(DraggableModal, {
17874
18476
  visible: true,
17875
18477
  cancelButtonProps: {
17876
18478
  hidden: true
@@ -17999,7 +18601,7 @@ const ViewPlugButtons = ({
17999
18601
  }));
18000
18602
  };
18001
18603
 
18002
- const Icon = ({
18604
+ const Icon$1 = ({
18003
18605
  url
18004
18606
  }) => {
18005
18607
  return /*#__PURE__*/React__default.createElement("svg", {
@@ -18048,20 +18650,20 @@ const useOptionCommands = drawingId => {
18048
18650
  const commands = React__default.useMemo(() => {
18049
18651
  return [{
18050
18652
  label: 'Zoom fit',
18051
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18653
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18052
18654
  url: img$q
18053
18655
  }),
18054
18656
  command: () => zoomToFit(drawingId)
18055
18657
  }, {
18056
18658
  label: 'Meshes',
18057
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18659
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18058
18660
  url: img$p
18059
18661
  }),
18060
18662
  isChecked: showFaces,
18061
18663
  command: () => setShowFaces(!showFaces)
18062
18664
  }, {
18063
18665
  label: 'Wireframe',
18064
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18666
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18065
18667
  url: img$n
18066
18668
  }),
18067
18669
  isChecked: showWireframe,
@@ -18069,14 +18671,14 @@ const useOptionCommands = drawingId => {
18069
18671
  command: () => setShowWireframe(!showWireframe)
18070
18672
  }, {
18071
18673
  label: 'Edges',
18072
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18674
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18073
18675
  url: img$o
18074
18676
  }),
18075
18677
  isChecked: showEdges,
18076
18678
  command: () => setShowEdges(!showEdges)
18077
18679
  }, {
18078
18680
  label: 'Vertices',
18079
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18681
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18080
18682
  url: img$E
18081
18683
  }),
18082
18684
  isChecked: showVertices,
@@ -18172,136 +18774,136 @@ const PartModeCmds = (drawingId, rootId) => {
18172
18774
  return {
18173
18775
  Sketch: {
18174
18776
  label: 'Sketch',
18175
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18777
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18176
18778
  url: img$w
18177
18779
  }),
18178
18780
  callback: wrapper(() => ccAPI.sketcher.createSketch(drawingId, rootId))
18179
18781
  },
18180
18782
  Work: [{
18181
18783
  label: 'Workpoint',
18182
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18784
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18183
18785
  url: img$m
18184
18786
  }),
18185
18787
  callback: wrapper(() => featureApi.createWorkPoint(drawingId, rootId))
18186
18788
  }, {
18187
18789
  label: 'Workaxis',
18188
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18790
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18189
18791
  url: img$l
18190
18792
  }),
18191
18793
  callback: wrapper(() => featureApi.createWorkAxis(drawingId, rootId))
18192
18794
  }, {
18193
18795
  label: 'Workplane',
18194
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18796
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18195
18797
  url: img$k
18196
18798
  }),
18197
18799
  callback: wrapper(() => featureApi.createWorkPlane(drawingId, rootId))
18198
18800
  }, {
18199
18801
  label: 'WCsys',
18200
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18802
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18201
18803
  url: img$j
18202
18804
  }),
18203
18805
  callback: wrapper(() => featureApi.createWorkCoordSystem(drawingId, rootId))
18204
18806
  }],
18205
18807
  Solid: [{
18206
18808
  label: 'Extrusion',
18207
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18809
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18208
18810
  url: img$G
18209
18811
  }),
18210
18812
  callback: wrapper(() => featureApi.createExtrusion(drawingId, rootId))
18211
18813
  }, {
18212
18814
  label: 'Revolve',
18213
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18815
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18214
18816
  url: img$F
18215
18817
  }),
18216
18818
  callback: wrapper(() => featureApi.createRevolve(drawingId, rootId))
18217
18819
  }],
18218
18820
  Boolean: {
18219
18821
  label: 'Boolean',
18220
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18822
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18221
18823
  url: img$i
18222
18824
  }),
18223
18825
  callback: wrapper(() => featureApi.createBooleanOperation(drawingId, rootId))
18224
18826
  },
18225
18827
  Slice: {
18226
18828
  label: 'Slice',
18227
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18829
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18228
18830
  url: img$f
18229
18831
  }),
18230
18832
  callback: wrapper(() => featureApi.createFeature(drawingId, rootId, CCClasses.CCSlice, 'Slice'))
18231
18833
  },
18232
18834
  Edge: [{
18233
18835
  label: 'Fillet',
18234
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18836
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18235
18837
  url: img$h
18236
18838
  }),
18237
18839
  callback: wrapper(() => featureApi.createFeature(drawingId, rootId, CCClasses.CCConstantRadiusFillet, 'Fillet'))
18238
18840
  }, {
18239
18841
  label: 'Chamfer',
18240
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18842
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18241
18843
  url: img$g
18242
18844
  }),
18243
18845
  callback: wrapper(() => featureApi.createFeature(drawingId, rootId, CCClasses.CCChamfer, 'Chamfer'))
18244
18846
  }],
18245
18847
  Patterns: [{
18246
18848
  label: 'Linear pattern',
18247
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18849
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18248
18850
  url: img$e
18249
18851
  }),
18250
18852
  callback: wrapper(() => featureApi.createFeature(drawingId, rootId, CCClasses.CCLinearPattern, 'Linear pattern'))
18251
18853
  }, {
18252
18854
  label: 'Circular pattern',
18253
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18855
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18254
18856
  url: img$d
18255
18857
  }),
18256
18858
  callback: wrapper(() => featureApi.createFeature(drawingId, rootId, CCClasses.CCCircularPattern, 'Circular pattern'))
18257
18859
  }],
18258
18860
  Translation: [{
18259
18861
  label: 'Translation',
18260
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18862
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18261
18863
  url: img$c
18262
18864
  }),
18263
18865
  callback: wrapper(() => featureApi.createFeature(drawingId, rootId, CCClasses.CCTranslation, 'Translate'))
18264
18866
  }, {
18265
18867
  label: 'Rotation',
18266
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18868
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18267
18869
  url: img$b
18268
18870
  }),
18269
18871
  callback: wrapper(() => featureApi.createFeature(drawingId, rootId, CCClasses.CCRotation, 'Rotate'))
18270
18872
  }, {
18271
18873
  label: 'Transformation by Csys',
18272
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18874
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18273
18875
  url: img$a
18274
18876
  }),
18275
18877
  callback: wrapper(() => featureApi.createFeature(drawingId, rootId, CCClasses.CCTransformationByCSys, 'Transform by Csys'))
18276
18878
  }],
18277
18879
  BasicShapes: [{
18278
18880
  label: 'Add Box',
18279
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18881
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18280
18882
  url: img$n
18281
18883
  }),
18282
18884
  callback: wrapper(() => featureApi.createFeature(drawingId, rootId, 'CC_Box', 'Box'))
18283
18885
  }, {
18284
18886
  label: 'Add Sphere',
18285
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18887
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18286
18888
  url: img$9
18287
18889
  }),
18288
18890
  callback: wrapper(() => featureApi.createFeature(drawingId, rootId, 'CC_Sphere', 'Sphere'))
18289
18891
  }, {
18290
18892
  label: 'Add Cylinder',
18291
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18893
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18292
18894
  url: img$8
18293
18895
  }),
18294
18896
  callback: wrapper(() => featureApi.createFeature(drawingId, rootId, 'CC_Cylinder', 'Cylinder'))
18295
18897
  }, {
18296
18898
  label: 'Add Cone',
18297
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18899
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18298
18900
  url: img$7
18299
18901
  }),
18300
18902
  callback: wrapper(() => featureApi.createFeature(drawingId, rootId, 'CC_Cone', 'Cone'))
18301
18903
  }],
18302
18904
  Import: {
18303
18905
  label: 'Import',
18304
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18906
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18305
18907
  url: img$r
18306
18908
  }),
18307
18909
  callback: wrapper(() => featureApi.createFeature(drawingId, rootId, CCClasses.CCImport, 'Import'))
@@ -18356,49 +18958,49 @@ const AssemblyModeCmds = (drawingId, rootId) => {
18356
18958
  return {
18357
18959
  FastenedOrigin: {
18358
18960
  label: 'Add Fastened Origin',
18359
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18961
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18360
18962
  url: img$6
18361
18963
  }),
18362
18964
  callback: wrapper(addFastenedOrigin)
18363
18965
  },
18364
18966
  Fastened: {
18365
18967
  label: 'Add Fastened',
18366
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18968
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18367
18969
  url: img$5
18368
18970
  }),
18369
18971
  callback: wrapper(addFastened)
18370
18972
  },
18371
18973
  Slider: {
18372
18974
  label: 'Add Slider',
18373
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18975
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18374
18976
  url: img$4
18375
18977
  }),
18376
18978
  callback: wrapper(addSlider)
18377
18979
  },
18378
18980
  Revolute: {
18379
18981
  label: 'Add Revolute',
18380
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18982
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18381
18983
  url: img$3
18382
18984
  }),
18383
18985
  callback: wrapper(addRevolute)
18384
18986
  },
18385
18987
  Cylindrical: {
18386
18988
  label: 'Add Cylindrical',
18387
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18989
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18388
18990
  url: img$2
18389
18991
  }),
18390
18992
  callback: wrapper(addCylindrical)
18391
18993
  },
18392
18994
  Planar: {
18393
18995
  label: 'Add Planar',
18394
- icon: /*#__PURE__*/React__default.createElement(Icon, {
18996
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18395
18997
  url: img$1
18396
18998
  }),
18397
18999
  callback: wrapper(addPlanar)
18398
19000
  },
18399
19001
  Parallel: {
18400
19002
  label: 'Add Parallel',
18401
- icon: /*#__PURE__*/React__default.createElement(Icon, {
19003
+ icon: /*#__PURE__*/React__default.createElement(Icon$1, {
18402
19004
  url: img
18403
19005
  }),
18404
19006
  callback: wrapper(addParallel)
@@ -18646,6 +19248,245 @@ const HoveredConstraintDisplay = ({
18646
19248
  }))));
18647
19249
  };
18648
19250
 
19251
+ function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
19252
+
19253
+ function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
19254
+
19255
+ function createApi(set) {
19256
+ return {
19257
+ setMsg: (msgId, msg) => set(prev => _objectSpread$1(_objectSpread$1({}, prev), {}, {
19258
+ msgs: _objectSpread$1(_objectSpread$1({}, prev.msgs), {}, {
19259
+ [msgId]: msg
19260
+ })
19261
+ })),
19262
+ deleteMsg: msgId => set(prev => {
19263
+ const newMsgs = _objectSpread$1({}, prev.msgs);
19264
+
19265
+ delete newMsgs[msgId];
19266
+ return _objectSpread$1(_objectSpread$1({}, prev), {}, {
19267
+ msgs: newMsgs
19268
+ });
19269
+ }),
19270
+ setShown: () => {
19271
+ set(prev => {
19272
+ const msgs = _objectSpread$1({}, prev.msgs);
19273
+
19274
+ Object.keys(msgs).forEach(msgId => {
19275
+ msgs[msgId].isShown = true;
19276
+ });
19277
+ return _objectSpread$1(_objectSpread$1({}, prev), {}, {
19278
+ msgs
19279
+ });
19280
+ });
19281
+ }
19282
+ };
19283
+ } // Buerli can store only single message in store.
19284
+ // But it will be convenient for the user to save all messages
19285
+ // and provide possibility to look through all messages came from the server.
19286
+
19287
+
19288
+ const useMsgStore = create((set, get) => ({
19289
+ msgs: {},
19290
+ api: createApi(set)
19291
+ }));
19292
+
19293
+ function getBorderColor(msg) {
19294
+ if (msg.isShown) return '#dddddd';
19295
+ if (msg.type === 'success') return '#b7eb8f';
19296
+ if (msg.type === 'error') return '#ffccc7';
19297
+ if (msg.type === 'warning') return '#ffe58f';
19298
+ if (msg.type === 'busy' || msg.type === 'info') return '#91d5ff';
19299
+ return '#91d5ff';
19300
+ }
19301
+
19302
+ function getBackGrColor(msg) {
19303
+ if (msg.isShown) return '#ffffff';
19304
+ if (msg.type === 'success') return '#f6ffed';
19305
+ if (msg.type === 'error') return '#fff2f0';
19306
+ if (msg.type === 'warning') return '#fffbe6';
19307
+ if (msg.type === 'busy' || msg.type === 'info') return '#e6f7ff';
19308
+ return '#e6f7ff';
19309
+ }
19310
+
19311
+ const MessageWrapper = styled.div`
19312
+ border: 1px solid ${props => getBorderColor(props.msg)};
19313
+ background-color: ${props => getBackGrColor(props.msg)};
19314
+ padding: 8px 15px;
19315
+ margin-bottom: 4px;
19316
+ `;
19317
+ const FlexContainer = styled.div`
19318
+ display: flex;
19319
+ align-items: center;
19320
+ `;
19321
+ const MessageText = styled.div`
19322
+ flex-grow: 1;
19323
+ overflow: auto;
19324
+ overflow-wrap: break-word;
19325
+ max-height: 300px;
19326
+ &::-webkit-scrollbar {
19327
+ width: 12px;
19328
+ }
19329
+ &::-webkit-scrollbar-thumb {
19330
+ border-radius: 10px;
19331
+ background-clip: padding-box;
19332
+ background-color: #d7d7d7;
19333
+ border: 3px solid rgba(0, 0, 0, 0); // Invisible boreder to emulate margin
19334
+ }
19335
+ `;
19336
+ const iconStyle = {
19337
+ marginRight: '8px'
19338
+ };
19339
+ const CloseButton = styled.button`
19340
+ margin-left: 8px;
19341
+ padding: 0;
19342
+ overflow: hidden;
19343
+ font-size: 12px;
19344
+ line-height: 12px;
19345
+ background-color: transparent;
19346
+ border: none;
19347
+ outline: none;
19348
+ cursor: pointer;
19349
+ `;
19350
+ const Time = styled.div`
19351
+ font-size: 0.7rem;
19352
+ color: #adadad;
19353
+ margin-left: 20px;
19354
+ `;
19355
+
19356
+ function getTime(timestamp) {
19357
+ const date = new Date(timestamp);
19358
+ return date.toLocaleTimeString(undefined, {
19359
+ hour: 'numeric',
19360
+ minute: '2-digit',
19361
+ hour12: false
19362
+ });
19363
+ }
19364
+
19365
+ const Icon = ({
19366
+ type
19367
+ }) => {
19368
+ if (type === 'success') return /*#__PURE__*/React__default.createElement(CheckCircleTwoTone, {
19369
+ twoToneColor: "#52c41a",
19370
+ style: iconStyle
19371
+ });
19372
+ if (type === 'error') return /*#__PURE__*/React__default.createElement(CloseCircleTwoTone, {
19373
+ twoToneColor: "#ff4d4f",
19374
+ style: iconStyle
19375
+ });
19376
+ if (type === 'warning') return /*#__PURE__*/React__default.createElement(ExclamationCircleTwoTone, {
19377
+ twoToneColor: "#faad14",
19378
+ style: iconStyle
19379
+ });
19380
+ if (type === 'busy' || type === 'info') return /*#__PURE__*/React__default.createElement(InfoCircleTwoTone, {
19381
+ twoToneColor: "#1890ff",
19382
+ style: iconStyle
19383
+ });
19384
+ return null;
19385
+ };
19386
+
19387
+ const Message = ({
19388
+ msgId
19389
+ }) => {
19390
+ const msg = useMsgStore(s => s.msgs[msgId]) || {};
19391
+ const msgApi = useMsgStore(s => s.api);
19392
+ const type = msg.type === 'busy' ? 'info' : msg.type;
19393
+ return /*#__PURE__*/React__default.createElement(MessageWrapper, {
19394
+ msg: msg
19395
+ }, /*#__PURE__*/React__default.createElement(FlexContainer, null, /*#__PURE__*/React__default.createElement(Icon, {
19396
+ type: type
19397
+ }), /*#__PURE__*/React__default.createElement(MessageText, null, `${msg.title} ${msg.text}`), /*#__PURE__*/React__default.createElement(CloseButton, {
19398
+ onClick: () => msgApi.deleteMsg(msgId)
19399
+ }, /*#__PURE__*/React__default.createElement(CloseOutlined, null))), /*#__PURE__*/React__default.createElement(Time, null, getTime(msg.timestamp)));
19400
+ };
19401
+
19402
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
19403
+
19404
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
19405
+ const MsgListWrapper = styled.div`
19406
+ max-height: 500px;
19407
+ max-width: 400px;
19408
+ min-width: 300px;
19409
+ overflow-y: auto;
19410
+ &::-webkit-scrollbar {
19411
+ width: 12px;
19412
+ }
19413
+ &::-webkit-scrollbar-thumb {
19414
+ border-radius: 10px;
19415
+ background-clip: padding-box;
19416
+ background-color: #cfcfcf;
19417
+ border: 3px solid rgba(0, 0, 0, 0); // Invisible boreder to emulate margin
19418
+ }
19419
+ z-index: ${blankZIndex + 1};
19420
+ `;
19421
+ const MessageList = ({
19422
+ drawingId
19423
+ }) => {
19424
+ const msgsIds = useMsgStore(s => {
19425
+ // Return array of messages with fresh messages in the beginning
19426
+ return Object.keys(s.msgs).sort((id1, id2) => s.msgs[id2].timestamp - s.msgs[id1].timestamp);
19427
+ });
19428
+ const msgsApi = useMsgStore(s => s.api); // Set isShow = true for all messages in store on unmount
19429
+
19430
+ React__default.useEffect(() => {
19431
+ return () => msgsApi.setShown();
19432
+ }, [msgsApi]);
19433
+ return /*#__PURE__*/React__default.createElement(MsgListWrapper, null, msgsIds.map(msgId => /*#__PURE__*/React__default.createElement(Message, {
19434
+ msgId: msgId,
19435
+ key: msgId
19436
+ })));
19437
+ };
19438
+ const Messages = ({
19439
+ drawingId
19440
+ }) => {
19441
+ const [showList, setShowList] = React__default.useState(false);
19442
+ const [showBadge, setShowBadge] = React__default.useState(false);
19443
+ const timestamp = useBuerli(state => state.message.timestamp);
19444
+ const msg = useBuerli(state => state.message.data);
19445
+ const msgsApi = useMsgStore(s => s.api);
19446
+ const msgsLen = useMsgStore(s => Object.keys(s.msgs).length);
19447
+ React__default.useEffect(() => setShowBadge(true), [timestamp]); // Add recent message to msgs store
19448
+
19449
+ React__default.useEffect(() => {
19450
+ if (timestamp && msg && (msg.text || msg.title)) {
19451
+ msgsApi.setMsg(msg.id, _objectSpread(_objectSpread({}, msg), {}, {
19452
+ timestamp,
19453
+ isShown: false
19454
+ }));
19455
+ }
19456
+ }, [timestamp, msg, msgsApi]); // Hide list when there is no cached messages
19457
+
19458
+ React__default.useEffect(() => {
19459
+ if (msgsLen === 0) setShowList(false);
19460
+ }, [msgsLen]);
19461
+ const onClick = React__default.useCallback(() => {
19462
+ if (showList) {
19463
+ getCADState().api.blankDiv.hide();
19464
+ } else {
19465
+ getCADState().api.blankDiv.show(() => setShowList(false));
19466
+ }
19467
+
19468
+ setShowList(s => !s);
19469
+ setShowBadge(false);
19470
+ }, [showList]);
19471
+ return /*#__PURE__*/React__default.createElement("div", {
19472
+ style: {
19473
+ display: 'flex',
19474
+ flexDirection: 'column',
19475
+ alignItems: 'flex-end'
19476
+ }
19477
+ }, showList && /*#__PURE__*/React__default.createElement(MessageList, {
19478
+ drawingId: drawingId
19479
+ }), /*#__PURE__*/React__default.createElement(Tooltip, {
19480
+ title: "Messages"
19481
+ }, /*#__PURE__*/React__default.createElement(Badge, {
19482
+ dot: showBadge
19483
+ }, /*#__PURE__*/React__default.createElement(Button, {
19484
+ size: "small",
19485
+ icon: /*#__PURE__*/React__default.createElement(UnorderedListOutlined, null),
19486
+ onClick: onClick
19487
+ }))));
19488
+ };
19489
+
18649
19490
  const EditDrawing = ({
18650
19491
  drawingId
18651
19492
  }) => {
@@ -18676,7 +19517,7 @@ const EditDrawing = ({
18676
19517
  }
18677
19518
  }), /*#__PURE__*/React__default.createElement("div", {
18678
19519
  style: {
18679
- flex: '1',
19520
+ flexGrow: 1,
18680
19521
  overflow: 'hidden'
18681
19522
  }
18682
19523
  }, /*#__PURE__*/React__default.createElement("div", {
@@ -18784,7 +19625,15 @@ const Drawing = ({
18784
19625
  }
18785
19626
  }), /*#__PURE__*/React__default.createElement(EditDrawing, {
18786
19627
  drawingId: drawingId
18787
- })));
19628
+ }), /*#__PURE__*/React__default.createElement("div", {
19629
+ style: {
19630
+ position: 'absolute',
19631
+ bottom: '4px',
19632
+ right: '4px'
19633
+ }
19634
+ }, /*#__PURE__*/React__default.createElement(Messages, {
19635
+ drawingId: drawingId
19636
+ })), /*#__PURE__*/React__default.createElement(BlankDiv, null)));
18788
19637
  };
18789
19638
 
18790
19639
  const CAD = ({