molde 0.1.3__tar.gz → 0.1.5__tar.gz
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.
- {molde-0.1.3 → molde-0.1.5}/PKG-INFO +6 -4
- {molde-0.1.3 → molde-0.1.5}/README.md +26 -26
- molde-0.1.5/molde/__init__.py +12 -0
- {molde-0.1.3 → molde-0.1.5}/molde/__main__.py +77 -74
- {molde-0.1.3 → molde-0.1.5}/molde/actors/__init__.py +5 -5
- {molde-0.1.3 → molde-0.1.5}/molde/actors/common_symbols_actor.py +164 -164
- {molde-0.1.3 → molde-0.1.5}/molde/actors/ghost_actor.py +12 -12
- {molde-0.1.3 → molde-0.1.5}/molde/actors/lines_actor.py +31 -31
- {molde-0.1.3 → molde-0.1.5}/molde/actors/round_points_actor.py +7 -7
- {molde-0.1.3 → molde-0.1.5}/molde/actors/square_points_actor.py +32 -32
- molde-0.1.5/molde/colors/__init__.py +2 -0
- {molde-0.1.3 → molde-0.1.5}/molde/colors/color.py +150 -120
- {molde-0.1.3 → molde-0.1.5}/molde/colors/color_names.py +124 -124
- {molde-0.1.3 → molde-0.1.5}/molde/interactor_styles/__init__.py +2 -2
- {molde-0.1.3 → molde-0.1.5}/molde/interactor_styles/arcball_camera_style.py +288 -288
- {molde-0.1.3 → molde-0.1.5}/molde/interactor_styles/box_selection_style.py +87 -70
- {molde-0.1.3 → molde-0.1.5}/molde/main_window.ui +864 -864
- {molde-0.1.3 → molde-0.1.5}/molde/pickers/__init__.py +2 -2
- {molde-0.1.3 → molde-0.1.5}/molde/pickers/cell_area_picker.py +61 -61
- {molde-0.1.3 → molde-0.1.5}/molde/pickers/cell_property_area_picker.py +84 -84
- {molde-0.1.3 → molde-0.1.5}/molde/poly_data/__init__.py +13 -13
- {molde-0.1.3 → molde-0.1.5}/molde/poly_data/lines_data.py +23 -23
- {molde-0.1.3 → molde-0.1.5}/molde/poly_data/vertices_data.py +24 -24
- {molde-0.1.3 → molde-0.1.5}/molde/render_widgets/__init__.py +2 -2
- {molde-0.1.3 → molde-0.1.5}/molde/render_widgets/animated_render_widget.py +164 -164
- {molde-0.1.3 → molde-0.1.5}/molde/render_widgets/common_render_widget.py +429 -433
- {molde-0.1.3 → molde-0.1.5}/molde/stylesheets/__init__.py +122 -119
- {molde-0.1.3 → molde-0.1.5}/molde/stylesheets/common.qss +16 -16
- {molde-0.1.3 → molde-0.1.5}/molde/stylesheets/create_color_page.py +61 -61
- {molde-0.1.3 → molde-0.1.5}/molde/stylesheets/mainwindow.ui +611 -611
- {molde-0.1.3 → molde-0.1.5}/molde/stylesheets/qcheckbox.qss +23 -18
- {molde-0.1.3 → molde-0.1.5}/molde/stylesheets/qinputs.qss +81 -78
- {molde-0.1.3 → molde-0.1.5}/molde/stylesheets/qlayouts.qss +23 -22
- {molde-0.1.3 → molde-0.1.5}/molde/stylesheets/qmenubar.qss +12 -12
- {molde-0.1.3 → molde-0.1.5}/molde/stylesheets/qprogressbar.qss +11 -11
- {molde-0.1.3 → molde-0.1.5}/molde/stylesheets/qpushbutton.qss +91 -91
- {molde-0.1.3 → molde-0.1.5}/molde/stylesheets/qradiobutton.qss +30 -30
- {molde-0.1.3 → molde-0.1.5}/molde/stylesheets/qscrollbar.qss +29 -29
- {molde-0.1.3 → molde-0.1.5}/molde/stylesheets/qslider.qss +61 -61
- {molde-0.1.3 → molde-0.1.5}/molde/stylesheets/qtablewidget.qss +27 -27
- {molde-0.1.3 → molde-0.1.5}/molde/stylesheets/qtabwidget.qss +28 -29
- {molde-0.1.3 → molde-0.1.5}/molde/stylesheets/qtoolbar.qss +52 -62
- {molde-0.1.3 → molde-0.1.5}/molde/stylesheets/qtoolbuttons.qss +14 -14
- {molde-0.1.3 → molde-0.1.5}/molde/stylesheets/qtreewidget.qss +25 -25
- {molde-0.1.3 → molde-0.1.5}/molde/ui_files/messages/new_loading_window.ui +73 -73
- {molde-0.1.3 → molde-0.1.5}/molde/utils/__init__.py +8 -8
- {molde-0.1.3 → molde-0.1.5}/molde/utils/format_sequences.py +44 -44
- {molde-0.1.3 → molde-0.1.5}/molde/utils/poly_data_utils.py +66 -66
- {molde-0.1.3 → molde-0.1.5}/molde/utils/tree_info.py +52 -52
- {molde-0.1.3 → molde-0.1.5}/molde/windows/loading_window.py +189 -189
- {molde-0.1.3 → molde-0.1.5}/pyproject.toml +28 -28
- molde-0.1.3/molde/__init__.py +0 -6
- molde-0.1.3/molde/colors/__init__.py +0 -2
- {molde-0.1.3 → molde-0.1.5}/molde/fonts/IBMPlexMono-Bold.ttf +0 -0
- {molde-0.1.3 → molde-0.1.5}/molde/fonts/IBMPlexMono-Regular.ttf +0 -0
- {molde-0.1.3 → molde-0.1.5}/molde/icons/arrow_down_dark_theme.svg +0 -0
- {molde-0.1.3 → molde-0.1.5}/molde/icons/arrow_down_disabled_dark_theme.svg +0 -0
- {molde-0.1.3 → molde-0.1.5}/molde/icons/arrow_down_disabled_light_theme.svg +0 -0
- {molde-0.1.3 → molde-0.1.5}/molde/icons/arrow_down_light_theme.svg +0 -0
- {molde-0.1.3 → molde-0.1.5}/molde/icons/arrow_left_dark_theme.svg +0 -0
- {molde-0.1.3 → molde-0.1.5}/molde/icons/arrow_left_light_theme.svg +0 -0
- {molde-0.1.3 → molde-0.1.5}/molde/icons/arrow_right_dark_theme.svg +0 -0
- {molde-0.1.3 → molde-0.1.5}/molde/icons/arrow_right_light_theme.svg +0 -0
- {molde-0.1.3 → molde-0.1.5}/molde/icons/arrow_up_dark_theme.svg +0 -0
- {molde-0.1.3 → molde-0.1.5}/molde/icons/arrow_up_disabled_dark_theme.svg +0 -0
- {molde-0.1.3 → molde-0.1.5}/molde/icons/arrow_up_disabled_light_theme.svg +0 -0
- {molde-0.1.3 → molde-0.1.5}/molde/icons/arrow_up_light_theme.svg +0 -0
- {molde-0.1.3 → molde-0.1.5}/molde/icons/check_box_image.svg +0 -0
- {molde-0.1.3 → molde-0.1.5}/molde/poly_data/arrows.py +0 -0
- {molde-0.1.3 → molde-0.1.5}/molde/poly_data/simple_shapes.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.3
|
2
2
|
Name: molde
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.5
|
4
4
|
Summary:
|
5
5
|
Author: André Fernandes
|
6
6
|
Author-email: fpf.andre@gmail.com
|
@@ -8,10 +8,12 @@ Requires-Python: >=3.10
|
|
8
8
|
Classifier: Programming Language :: Python :: 3
|
9
9
|
Classifier: Programming Language :: Python :: 3.10
|
10
10
|
Classifier: Programming Language :: Python :: 3.11
|
11
|
+
Classifier: Programming Language :: Python :: 3.12
|
12
|
+
Classifier: Programming Language :: Python :: 3.13
|
11
13
|
Requires-Dist: moviepy (>=1.0.3,<2.0.0)
|
12
14
|
Requires-Dist: numpy (>=2.0,<3.0)
|
13
|
-
Requires-Dist:
|
14
|
-
Requires-Dist:
|
15
|
+
Requires-Dist: pyside6 (>=6.8.1,<7.0.0) ; python_version >= "3.10" and python_version < "3.14"
|
16
|
+
Requires-Dist: qtpy (>=2.4.2,<3.0.0)
|
15
17
|
Requires-Dist: vtk (>=9.3.1,<10.0.0)
|
16
18
|
Description-Content-Type: text/markdown
|
17
19
|
|
@@ -1,26 +1,26 @@
|
|
1
|
-
<div align="center">
|
2
|
-
<img height="90" src="logos/mold_horizontal_logo_dark_300dpi.png" alt="Logo" align="center">
|
3
|
-
</div>
|
4
|
-
|
5
|
-
# MOLDE
|
6
|
-
**M**OPT **L**ightweight **De**esign (MOLDE) is a library created to standardize and make easier the creation and maintainance of internal products of the Multidisciplinary Optimization Group (MOPT).
|
7
|
-
|
8
|
-
Here are the colors, icons, fonts and common interface components, that may be usefull for multiple MOPT projects.
|
9
|
-
|
10
|
-
This is heavily inspired by [Carbon Design System](https://carbondesignsystem.com/), [Atlassian Design System](https://atlassian.design/), [Fast Design System](https://www.fast.design/), [Material Design](https://m3.material.io/) and [Bold Design System](https://bold.bridge.ufsc.br/pt/).
|
11
|
-
|
12
|
-
# Colors
|
13
|
-
The color palettes are available [here](https://andrefpf.github.io/molde/).
|
14
|
-
|
15
|
-
# Icons
|
16
|
-
A lot of free to use icons, from Material Design, are available [here](https://fonts.google.com/icons).
|
17
|
-
Other icons may be necessary, and they will be made to match the same style.
|
18
|
-
For consistency avoid using icons from other places.
|
19
|
-
|
20
|
-
# Typeface
|
21
|
-
The font choose for this system is [IBM Plex](https://www.ibm.com/plex/).
|
22
|
-
The `.ttf` files for every version of the font, including monospaced, can be found [here](https://github.com/IBM/plex/tree/master/packages).
|
23
|
-
|
24
|
-
# Component
|
25
|
-
The sylesheets of the Qt components are designed to make it similar to [Atlassian components](https://atlassian.design/components/).
|
26
|
-
Always check for the Atlassian component usage guide in case of any doubt.
|
1
|
+
<div align="center">
|
2
|
+
<img height="90" src="logos/mold_horizontal_logo_dark_300dpi.png" alt="Logo" align="center">
|
3
|
+
</div>
|
4
|
+
|
5
|
+
# MOLDE
|
6
|
+
**M**OPT **L**ightweight **De**esign (MOLDE) is a library created to standardize and make easier the creation and maintainance of internal products of the Multidisciplinary Optimization Group (MOPT).
|
7
|
+
|
8
|
+
Here are the colors, icons, fonts and common interface components, that may be usefull for multiple MOPT projects.
|
9
|
+
|
10
|
+
This is heavily inspired by [Carbon Design System](https://carbondesignsystem.com/), [Atlassian Design System](https://atlassian.design/), [Fast Design System](https://www.fast.design/), [Material Design](https://m3.material.io/) and [Bold Design System](https://bold.bridge.ufsc.br/pt/).
|
11
|
+
|
12
|
+
# Colors
|
13
|
+
The color palettes are available [here](https://andrefpf.github.io/molde/).
|
14
|
+
|
15
|
+
# Icons
|
16
|
+
A lot of free to use icons, from Material Design, are available [here](https://fonts.google.com/icons).
|
17
|
+
Other icons may be necessary, and they will be made to match the same style.
|
18
|
+
For consistency avoid using icons from other places.
|
19
|
+
|
20
|
+
# Typeface
|
21
|
+
The font choose for this system is [IBM Plex](https://www.ibm.com/plex/).
|
22
|
+
The `.ttf` files for every version of the font, including monospaced, can be found [here](https://github.com/IBM/plex/tree/master/packages).
|
23
|
+
|
24
|
+
# Component
|
25
|
+
The sylesheets of the Qt components are designed to make it similar to [Atlassian components](https://atlassian.design/components/).
|
26
|
+
Always check for the Atlassian component usage guide in case of any doubt.
|
@@ -0,0 +1,12 @@
|
|
1
|
+
from pathlib import Path
|
2
|
+
from qtpy.uic import loadUi
|
3
|
+
from .colors import Color
|
4
|
+
from PySide6.QtCore import QDir
|
5
|
+
|
6
|
+
MOLDE_DIR = Path(__file__).parent
|
7
|
+
UI_DIR = MOLDE_DIR / "ui_files/"
|
8
|
+
|
9
|
+
def load_ui(uifile: str | Path, baseinstance, working_directory: str| Path = None):
|
10
|
+
if working_directory is not None:
|
11
|
+
working_directory = QDir(working_directory)
|
12
|
+
return loadUi(uifile, baseinstance, working_directory)
|
@@ -1,74 +1,77 @@
|
|
1
|
-
import os, sys
|
2
|
-
from
|
3
|
-
from
|
4
|
-
from
|
5
|
-
from
|
6
|
-
|
7
|
-
|
8
|
-
from vtkmodules.
|
9
|
-
|
10
|
-
|
11
|
-
from molde import
|
12
|
-
from molde import
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
self.
|
23
|
-
self.render_widget
|
24
|
-
self.render_widget.
|
25
|
-
self.render_widget.
|
26
|
-
self.render_widget.
|
27
|
-
|
28
|
-
|
29
|
-
cylinder
|
30
|
-
|
31
|
-
cylinder_mapper
|
32
|
-
|
33
|
-
cylinder_actor
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
self.
|
38
|
-
self.
|
39
|
-
self.
|
40
|
-
self.
|
41
|
-
self.toolbar_2.addWidget(self.
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
sys.
|
1
|
+
import os, sys
|
2
|
+
from PySide6.QtWidgets import QMainWindow, QApplication, QMessageBox, QLineEdit, QTableWidgetItem, QPushButton, QLabel, QSlider
|
3
|
+
from PySide6.QtGui import QColor
|
4
|
+
from PySide6.QtCore import Qt
|
5
|
+
from time import time
|
6
|
+
|
7
|
+
from vtkmodules.vtkFiltersSources import vtkCylinderSource
|
8
|
+
from vtkmodules.vtkRenderingCore import vtkPolyDataMapper, vtkActor
|
9
|
+
|
10
|
+
from molde import MOLDE_DIR, load_ui
|
11
|
+
from molde import stylesheets
|
12
|
+
from molde.render_widgets.common_render_widget import CommonRenderWidget
|
13
|
+
|
14
|
+
|
15
|
+
class Example(QMainWindow):
|
16
|
+
def __init__(self, parent=None) -> None:
|
17
|
+
super().__init__()
|
18
|
+
load_ui(MOLDE_DIR / "stylesheets/mainwindow.ui", self, MOLDE_DIR / "stylesheets")
|
19
|
+
self.current_theme = "light"
|
20
|
+
|
21
|
+
self.change_theme_button.clicked.connect(self.change_theme)
|
22
|
+
# self.render_widget: CommonRenderWidget
|
23
|
+
# self.render_widget.create_axes()
|
24
|
+
# self.render_widget.create_scale_bar()
|
25
|
+
# self.render_widget.create_color_bar()
|
26
|
+
# self.render_widget.set_info_text("Hola\nque\ntal?")
|
27
|
+
|
28
|
+
cylinder = vtkCylinderSource()
|
29
|
+
cylinder.SetResolution(8)
|
30
|
+
cylinder_mapper = vtkPolyDataMapper()
|
31
|
+
cylinder_mapper.SetInputConnection(cylinder.GetOutputPort())
|
32
|
+
cylinder_actor = vtkActor()
|
33
|
+
cylinder_actor.SetMapper(cylinder_mapper)
|
34
|
+
# self.render_widget.add_actors(cylinder_actor)
|
35
|
+
|
36
|
+
self.botao1 = QPushButton()
|
37
|
+
self.label = QLabel("Olha o sapooo")
|
38
|
+
self.slider = QSlider(Qt.Orientation.Horizontal)
|
39
|
+
self.slider.setValue(50)
|
40
|
+
self.botao1.setText("Olha a faca")
|
41
|
+
self.toolbar_2.addWidget(self.label)
|
42
|
+
self.toolbar_2.addWidget(self.botao1)
|
43
|
+
self.toolbar_2.addWidget(self.slider)
|
44
|
+
self.toolbar_2.setDisabled(True)
|
45
|
+
|
46
|
+
item = QTableWidgetItem("fr")
|
47
|
+
item.setBackground(QColor("#FF0000"))
|
48
|
+
self.tableWidget.setItem(0, 0, item)
|
49
|
+
self.show()
|
50
|
+
|
51
|
+
def change_theme(self):
|
52
|
+
if self.current_theme == "light":
|
53
|
+
self.current_theme = "dark"
|
54
|
+
else:
|
55
|
+
self.current_theme = "light"
|
56
|
+
|
57
|
+
# self.render_widget.set_theme(self.current_theme)
|
58
|
+
stylesheets.set_theme(self.current_theme)
|
59
|
+
|
60
|
+
def closeEvent(self, event):
|
61
|
+
close = QMessageBox.question(
|
62
|
+
self,
|
63
|
+
"QUIT",
|
64
|
+
"Would you like to close the application?",
|
65
|
+
QMessageBox.Yes | QMessageBox.No
|
66
|
+
)
|
67
|
+
QApplication.quit()
|
68
|
+
|
69
|
+
|
70
|
+
if __name__ == "__main__":
|
71
|
+
# Make the window scale evenly for every monitor
|
72
|
+
os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1"
|
73
|
+
|
74
|
+
app = QApplication(sys.argv)
|
75
|
+
e = Example()
|
76
|
+
e.change_theme()
|
77
|
+
sys.exit(app.exec())
|
@@ -1,5 +1,5 @@
|
|
1
|
-
from .ghost_actor import GhostActor
|
2
|
-
from .lines_actor import LinesActor
|
3
|
-
from .round_points_actor import RoundPointsActor
|
4
|
-
from .square_points_actor import SquarePointsActor
|
5
|
-
from .common_symbols_actor import CommonSymbolsActorFixedSize, CommonSymbolsActorVariableSize
|
1
|
+
from .ghost_actor import GhostActor
|
2
|
+
from .lines_actor import LinesActor
|
3
|
+
from .round_points_actor import RoundPointsActor
|
4
|
+
from .square_points_actor import SquarePointsActor
|
5
|
+
from .common_symbols_actor import CommonSymbolsActorFixedSize, CommonSymbolsActorVariableSize
|
@@ -1,164 +1,164 @@
|
|
1
|
-
from dataclasses import dataclass
|
2
|
-
|
3
|
-
from molde import Color
|
4
|
-
from molde.utils import transform_polydata
|
5
|
-
from vtkmodules.vtkCommonCore import (
|
6
|
-
vtkDoubleArray,
|
7
|
-
vtkIntArray,
|
8
|
-
vtkPoints,
|
9
|
-
vtkUnsignedCharArray,
|
10
|
-
)
|
11
|
-
from vtkmodules.vtkCommonDataModel import vtkPolyData
|
12
|
-
from vtkmodules.vtkRenderingCore import vtkActor, vtkDistanceToCamera, vtkGlyph3DMapper, vtkRenderer
|
13
|
-
|
14
|
-
Triple = tuple[float, float, float]
|
15
|
-
|
16
|
-
|
17
|
-
@dataclass
|
18
|
-
class Symbol:
|
19
|
-
shape_name: str
|
20
|
-
position: Triple
|
21
|
-
orientation: Triple
|
22
|
-
color: Color
|
23
|
-
scale: float
|
24
|
-
|
25
|
-
|
26
|
-
class CommonSymbolsActor(vtkActor):
|
27
|
-
def __init__(self, *args, **kwargs):
|
28
|
-
self._shapes: dict[str, vtkPolyData] = dict()
|
29
|
-
self._symbols: list[Symbol] = list()
|
30
|
-
|
31
|
-
def register_shape(
|
32
|
-
self,
|
33
|
-
name: str,
|
34
|
-
shape: vtkPolyData,
|
35
|
-
position: Triple = (0, 0, 0),
|
36
|
-
rotation: Triple = (0, 0, 0),
|
37
|
-
scale: Triple = (1, 1, 1),
|
38
|
-
):
|
39
|
-
self._shapes[name] = transform_polydata(
|
40
|
-
shape,
|
41
|
-
position,
|
42
|
-
rotation,
|
43
|
-
scale,
|
44
|
-
)
|
45
|
-
|
46
|
-
def add_symbol(
|
47
|
-
self,
|
48
|
-
shape_name: str,
|
49
|
-
position: Triple,
|
50
|
-
orientation: Triple,
|
51
|
-
color: Triple,
|
52
|
-
scale: float = 1,
|
53
|
-
):
|
54
|
-
symbol = Symbol(
|
55
|
-
shape_name,
|
56
|
-
position,
|
57
|
-
orientation,
|
58
|
-
color,
|
59
|
-
scale,
|
60
|
-
)
|
61
|
-
self._symbols.append(symbol)
|
62
|
-
|
63
|
-
def clear_shapes(self):
|
64
|
-
self._shapes.clear()
|
65
|
-
|
66
|
-
def clear_symbols(self):
|
67
|
-
self._symbols.clear()
|
68
|
-
|
69
|
-
def clear_all(self):
|
70
|
-
self.clear_shapes()
|
71
|
-
self.clear_symbols()
|
72
|
-
|
73
|
-
def common_build(self):
|
74
|
-
self.data = vtkPolyData()
|
75
|
-
points = vtkPoints()
|
76
|
-
|
77
|
-
self.mapper: vtkGlyph3DMapper = vtkGlyph3DMapper()
|
78
|
-
self.SetMapper(self.mapper)
|
79
|
-
|
80
|
-
sources = vtkIntArray()
|
81
|
-
sources.SetName("sources")
|
82
|
-
|
83
|
-
rotations = vtkDoubleArray()
|
84
|
-
rotations.SetNumberOfComponents(3)
|
85
|
-
rotations.SetName("rotations")
|
86
|
-
|
87
|
-
scales = vtkDoubleArray()
|
88
|
-
scales.SetName("scales")
|
89
|
-
|
90
|
-
colors = vtkUnsignedCharArray()
|
91
|
-
colors.SetNumberOfComponents(3)
|
92
|
-
colors.SetName("colors")
|
93
|
-
|
94
|
-
shape_name_to_index = dict()
|
95
|
-
for index, (name, shape) in enumerate(self._shapes.items()):
|
96
|
-
shape_name_to_index[name] = index
|
97
|
-
self.mapper.SetSourceData(index, shape)
|
98
|
-
|
99
|
-
for symbol in self._symbols:
|
100
|
-
points.InsertNextPoint(symbol.position)
|
101
|
-
rotations.InsertNextTuple(symbol.orientation)
|
102
|
-
colors.InsertNextTuple(symbol.color.to_rgb())
|
103
|
-
scales.InsertNextValue(symbol.scale)
|
104
|
-
sources.InsertNextValue(shape_name_to_index[symbol.shape_name])
|
105
|
-
|
106
|
-
self.data.SetPoints(points)
|
107
|
-
self.data.GetPointData().AddArray(sources)
|
108
|
-
self.data.GetPointData().AddArray(rotations)
|
109
|
-
self.data.GetPointData().AddArray(scales)
|
110
|
-
self.data.GetPointData().SetScalars(colors)
|
111
|
-
|
112
|
-
def set_zbuffer_offsets(self, factor: float, units: float):
|
113
|
-
"""
|
114
|
-
This functions is usefull to make a object appear in front of the others.
|
115
|
-
If the object should never be hidden, the parameters should be set to
|
116
|
-
factor = 1 and offset = -66000.
|
117
|
-
"""
|
118
|
-
self.mapper.SetResolveCoincidentTopologyToPolygonOffset()
|
119
|
-
self.mapper.SetRelativeCoincidentTopologyLineOffsetParameters(factor, units)
|
120
|
-
self.mapper.SetRelativeCoincidentTopologyPolygonOffsetParameters(factor, units)
|
121
|
-
self.mapper.SetRelativeCoincidentTopologyPointOffsetParameter(units)
|
122
|
-
self.mapper.Update()
|
123
|
-
|
124
|
-
|
125
|
-
class CommonSymbolsActorFixedSize(CommonSymbolsActor):
|
126
|
-
def build(self):
|
127
|
-
self.common_build()
|
128
|
-
|
129
|
-
self.mapper.SetInputData(self.data)
|
130
|
-
self.mapper.SetSourceIndexArray("sources")
|
131
|
-
self.mapper.SetOrientationArray("rotations")
|
132
|
-
self.mapper.SetScaleArray("scales")
|
133
|
-
self.mapper.SourceIndexingOn()
|
134
|
-
self.mapper.ScalarVisibilityOn()
|
135
|
-
self.mapper.SetScaleModeToScaleByMagnitude()
|
136
|
-
self.mapper.SetScalarModeToUsePointData()
|
137
|
-
self.mapper.SetOrientationModeToDirection()
|
138
|
-
self.mapper.Update()
|
139
|
-
|
140
|
-
|
141
|
-
class CommonSymbolsActorVariableSize(CommonSymbolsActor):
|
142
|
-
def __init__(self, renderer: vtkRenderer):
|
143
|
-
super().__init__()
|
144
|
-
self.renderer = renderer
|
145
|
-
|
146
|
-
def build(self):
|
147
|
-
self.common_build()
|
148
|
-
|
149
|
-
distance_to_camera = vtkDistanceToCamera()
|
150
|
-
distance_to_camera.SetInputData(self.data)
|
151
|
-
distance_to_camera.SetScreenSize(40)
|
152
|
-
distance_to_camera.SetRenderer(self.renderer)
|
153
|
-
|
154
|
-
self.mapper.SetInputConnection(distance_to_camera.GetOutputPort())
|
155
|
-
self.mapper.SetSourceIndexArray("sources")
|
156
|
-
self.mapper.SetOrientationArray("rotations")
|
157
|
-
self.mapper.SetScaleArray("DistanceToCamera")
|
158
|
-
self.mapper.SourceIndexingOn()
|
159
|
-
self.mapper.ScalarVisibilityOn()
|
160
|
-
self.mapper.SetScaleModeToScaleByMagnitude()
|
161
|
-
self.mapper.SetScalarModeToUsePointData()
|
162
|
-
self.mapper.SetOrientationModeToDirection()
|
163
|
-
|
164
|
-
self.mapper.Update()
|
1
|
+
from dataclasses import dataclass
|
2
|
+
|
3
|
+
from molde import Color
|
4
|
+
from molde.utils import transform_polydata
|
5
|
+
from vtkmodules.vtkCommonCore import (
|
6
|
+
vtkDoubleArray,
|
7
|
+
vtkIntArray,
|
8
|
+
vtkPoints,
|
9
|
+
vtkUnsignedCharArray,
|
10
|
+
)
|
11
|
+
from vtkmodules.vtkCommonDataModel import vtkPolyData
|
12
|
+
from vtkmodules.vtkRenderingCore import vtkActor, vtkDistanceToCamera, vtkGlyph3DMapper, vtkRenderer
|
13
|
+
|
14
|
+
Triple = tuple[float, float, float]
|
15
|
+
|
16
|
+
|
17
|
+
@dataclass
|
18
|
+
class Symbol:
|
19
|
+
shape_name: str
|
20
|
+
position: Triple
|
21
|
+
orientation: Triple
|
22
|
+
color: Color
|
23
|
+
scale: float
|
24
|
+
|
25
|
+
|
26
|
+
class CommonSymbolsActor(vtkActor):
|
27
|
+
def __init__(self, *args, **kwargs):
|
28
|
+
self._shapes: dict[str, vtkPolyData] = dict()
|
29
|
+
self._symbols: list[Symbol] = list()
|
30
|
+
|
31
|
+
def register_shape(
|
32
|
+
self,
|
33
|
+
name: str,
|
34
|
+
shape: vtkPolyData,
|
35
|
+
position: Triple = (0, 0, 0),
|
36
|
+
rotation: Triple = (0, 0, 0),
|
37
|
+
scale: Triple = (1, 1, 1),
|
38
|
+
):
|
39
|
+
self._shapes[name] = transform_polydata(
|
40
|
+
shape,
|
41
|
+
position,
|
42
|
+
rotation,
|
43
|
+
scale,
|
44
|
+
)
|
45
|
+
|
46
|
+
def add_symbol(
|
47
|
+
self,
|
48
|
+
shape_name: str,
|
49
|
+
position: Triple,
|
50
|
+
orientation: Triple,
|
51
|
+
color: Triple,
|
52
|
+
scale: float = 1,
|
53
|
+
):
|
54
|
+
symbol = Symbol(
|
55
|
+
shape_name,
|
56
|
+
position,
|
57
|
+
orientation,
|
58
|
+
color,
|
59
|
+
scale,
|
60
|
+
)
|
61
|
+
self._symbols.append(symbol)
|
62
|
+
|
63
|
+
def clear_shapes(self):
|
64
|
+
self._shapes.clear()
|
65
|
+
|
66
|
+
def clear_symbols(self):
|
67
|
+
self._symbols.clear()
|
68
|
+
|
69
|
+
def clear_all(self):
|
70
|
+
self.clear_shapes()
|
71
|
+
self.clear_symbols()
|
72
|
+
|
73
|
+
def common_build(self):
|
74
|
+
self.data = vtkPolyData()
|
75
|
+
points = vtkPoints()
|
76
|
+
|
77
|
+
self.mapper: vtkGlyph3DMapper = vtkGlyph3DMapper()
|
78
|
+
self.SetMapper(self.mapper)
|
79
|
+
|
80
|
+
sources = vtkIntArray()
|
81
|
+
sources.SetName("sources")
|
82
|
+
|
83
|
+
rotations = vtkDoubleArray()
|
84
|
+
rotations.SetNumberOfComponents(3)
|
85
|
+
rotations.SetName("rotations")
|
86
|
+
|
87
|
+
scales = vtkDoubleArray()
|
88
|
+
scales.SetName("scales")
|
89
|
+
|
90
|
+
colors = vtkUnsignedCharArray()
|
91
|
+
colors.SetNumberOfComponents(3)
|
92
|
+
colors.SetName("colors")
|
93
|
+
|
94
|
+
shape_name_to_index = dict()
|
95
|
+
for index, (name, shape) in enumerate(self._shapes.items()):
|
96
|
+
shape_name_to_index[name] = index
|
97
|
+
self.mapper.SetSourceData(index, shape)
|
98
|
+
|
99
|
+
for symbol in self._symbols:
|
100
|
+
points.InsertNextPoint(symbol.position)
|
101
|
+
rotations.InsertNextTuple(symbol.orientation)
|
102
|
+
colors.InsertNextTuple(symbol.color.to_rgb())
|
103
|
+
scales.InsertNextValue(symbol.scale)
|
104
|
+
sources.InsertNextValue(shape_name_to_index[symbol.shape_name])
|
105
|
+
|
106
|
+
self.data.SetPoints(points)
|
107
|
+
self.data.GetPointData().AddArray(sources)
|
108
|
+
self.data.GetPointData().AddArray(rotations)
|
109
|
+
self.data.GetPointData().AddArray(scales)
|
110
|
+
self.data.GetPointData().SetScalars(colors)
|
111
|
+
|
112
|
+
def set_zbuffer_offsets(self, factor: float, units: float):
|
113
|
+
"""
|
114
|
+
This functions is usefull to make a object appear in front of the others.
|
115
|
+
If the object should never be hidden, the parameters should be set to
|
116
|
+
factor = 1 and offset = -66000.
|
117
|
+
"""
|
118
|
+
self.mapper.SetResolveCoincidentTopologyToPolygonOffset()
|
119
|
+
self.mapper.SetRelativeCoincidentTopologyLineOffsetParameters(factor, units)
|
120
|
+
self.mapper.SetRelativeCoincidentTopologyPolygonOffsetParameters(factor, units)
|
121
|
+
self.mapper.SetRelativeCoincidentTopologyPointOffsetParameter(units)
|
122
|
+
self.mapper.Update()
|
123
|
+
|
124
|
+
|
125
|
+
class CommonSymbolsActorFixedSize(CommonSymbolsActor):
|
126
|
+
def build(self):
|
127
|
+
self.common_build()
|
128
|
+
|
129
|
+
self.mapper.SetInputData(self.data)
|
130
|
+
self.mapper.SetSourceIndexArray("sources")
|
131
|
+
self.mapper.SetOrientationArray("rotations")
|
132
|
+
self.mapper.SetScaleArray("scales")
|
133
|
+
self.mapper.SourceIndexingOn()
|
134
|
+
self.mapper.ScalarVisibilityOn()
|
135
|
+
self.mapper.SetScaleModeToScaleByMagnitude()
|
136
|
+
self.mapper.SetScalarModeToUsePointData()
|
137
|
+
self.mapper.SetOrientationModeToDirection()
|
138
|
+
self.mapper.Update()
|
139
|
+
|
140
|
+
|
141
|
+
class CommonSymbolsActorVariableSize(CommonSymbolsActor):
|
142
|
+
def __init__(self, renderer: vtkRenderer):
|
143
|
+
super().__init__()
|
144
|
+
self.renderer = renderer
|
145
|
+
|
146
|
+
def build(self):
|
147
|
+
self.common_build()
|
148
|
+
|
149
|
+
distance_to_camera = vtkDistanceToCamera()
|
150
|
+
distance_to_camera.SetInputData(self.data)
|
151
|
+
distance_to_camera.SetScreenSize(40)
|
152
|
+
distance_to_camera.SetRenderer(self.renderer)
|
153
|
+
|
154
|
+
self.mapper.SetInputConnection(distance_to_camera.GetOutputPort())
|
155
|
+
self.mapper.SetSourceIndexArray("sources")
|
156
|
+
self.mapper.SetOrientationArray("rotations")
|
157
|
+
self.mapper.SetScaleArray("DistanceToCamera")
|
158
|
+
self.mapper.SourceIndexingOn()
|
159
|
+
self.mapper.ScalarVisibilityOn()
|
160
|
+
self.mapper.SetScaleModeToScaleByMagnitude()
|
161
|
+
self.mapper.SetScalarModeToUsePointData()
|
162
|
+
self.mapper.SetOrientationModeToDirection()
|
163
|
+
|
164
|
+
self.mapper.Update()
|
@@ -1,12 +1,12 @@
|
|
1
|
-
from vtkmodules.vtkRenderingCore import vtkActor
|
2
|
-
|
3
|
-
|
4
|
-
class GhostActor(vtkActor):
|
5
|
-
def make_ghost(self):
|
6
|
-
self.GetProperty().LightingOff()
|
7
|
-
offset = -66000
|
8
|
-
mapper = self.GetMapper()
|
9
|
-
mapper.SetResolveCoincidentTopologyToPolygonOffset()
|
10
|
-
mapper.SetRelativeCoincidentTopologyLineOffsetParameters(0, offset)
|
11
|
-
mapper.SetRelativeCoincidentTopologyPolygonOffsetParameters(0, offset)
|
12
|
-
mapper.SetRelativeCoincidentTopologyPointOffsetParameter(offset)
|
1
|
+
from vtkmodules.vtkRenderingCore import vtkActor
|
2
|
+
|
3
|
+
|
4
|
+
class GhostActor(vtkActor):
|
5
|
+
def make_ghost(self):
|
6
|
+
self.GetProperty().LightingOff()
|
7
|
+
offset = -66000
|
8
|
+
mapper = self.GetMapper()
|
9
|
+
mapper.SetResolveCoincidentTopologyToPolygonOffset()
|
10
|
+
mapper.SetRelativeCoincidentTopologyLineOffsetParameters(0, offset)
|
11
|
+
mapper.SetRelativeCoincidentTopologyPolygonOffsetParameters(0, offset)
|
12
|
+
mapper.SetRelativeCoincidentTopologyPointOffsetParameter(offset)
|