triplot 1.1.0__py3-none-any.whl

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.
@@ -0,0 +1,315 @@
1
+ Metadata-Version: 2.4
2
+ Name: triplot
3
+ Version: 1.1.0
4
+ Summary: An interactive panel for stacked DSC scans from TA Instruments TRIOS files.
5
+ Author: Christian Nelle
6
+ License-Expression: MIT
7
+ Keywords: dsc,calorimetry,trios,ta instruments,thermal analysis,plotting
8
+ Classifier: Development Status :: 5 - Production/Stable
9
+ Classifier: Intended Audience :: Science/Research
10
+ Classifier: Topic :: Scientific/Engineering :: Chemistry
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.10
13
+ Classifier: Operating System :: Microsoft :: Windows
14
+ Classifier: Environment :: X11 Applications :: Qt
15
+ Requires-Python: >=3.10
16
+ Description-Content-Type: text/markdown
17
+ License-File: LICENSE
18
+ Requires-Dist: numpy
19
+ Requires-Dist: PySide6-Essentials
20
+ Requires-Dist: rdkit
21
+ Provides-Extra: test
22
+ Requires-Dist: pytest; extra == "test"
23
+ Provides-Extra: structures
24
+ Requires-Dist: rdkit; extra == "structures"
25
+ Dynamic: license-file
26
+
27
+ # Triplot
28
+
29
+ An interactive panel for stacked DSC scans from TA Instruments **TRIOS**
30
+ files. Drop `.tri` files on it, stack the scans into the arrangement you want,
31
+ mark an interval on a curve to analyse it, and hand the result to a figure: a
32
+ PNG or SVG, a CSV, or a `DSC_Plotter.py` script that redraws it in matplotlib.
33
+
34
+ It reads TRIOS `.tri` files and `.txt` exports from DSC and SDT (TGA + DSC)
35
+ instruments with its own reader, validated against TRIOS's exports value by
36
+ value (`tests/test_reader.py`).
37
+
38
+ ```bash
39
+ pip install triplot
40
+ triplot # start it
41
+ triplot my-sample.tri # straight into a file
42
+ triplot register # put it in the Start Menu (optional)
43
+ ```
44
+
45
+ Python 3.10 or newer; PySide6 (the Essentials only), numpy and RDKit come
46
+ with it. From a checkout, `pip install -e <checkout>` installs it editable.
47
+ Version 1.1.0; what changed is in `CHANGELOG.md`.
48
+
49
+ It was called **DSC-Panel** until 1.0.0 and installed from the repository
50
+ as `ach-dsc-panel`. To move over, uninstall that first (both install the
51
+ same `dscpanel` package), then clean up the old name's Start Menu entry:
52
+
53
+ ```bash
54
+ pip uninstall ach-dsc-panel
55
+ pip install triplot
56
+ triplot register --clean-legacy
57
+ triplot register
58
+ ```
59
+
60
+ Its preferences, presets and window place come across by themselves the
61
+ first time Triplot starts, and saved figures keep their `.dscpanel`
62
+ extension.
63
+
64
+ ## What it does differently from a plotting script
65
+
66
+ - **Every segment is an object.** A `.tri` holds a heating ramp, a cooling
67
+ ramp and usually five more; each one is a scan you can select, move, hide,
68
+ colour and right-click. A file opens with its first heating scan on the
69
+ plot and every other segment listed in the outliner, one tick away - so
70
+ comparing the second and third up-scans of four samples is four ticks.
71
+ - **Three themes.** `blender-default` is the dark screen one, `light` is
72
+ the same figure on white, `boombox` a brushed-metal dark one. Exports are
73
+ always light, whichever is on screen.
74
+ - **Analyses are objects, and they start off.** A run carries a dozen stored
75
+ analyses; each is a row in the outliner with its own box, its own colour
76
+ and its own settings. Where the file could not say for certain which scan
77
+ an analysis belongs to (a `.txt` export names only the step), it is drawn
78
+ with a dashed tick and a question mark, and it can be moved to the right
79
+ scan by hand.
80
+ - **The stack is continuous.** Scans go wherever you put them (`G`, or just
81
+ type a number), and the offset each one carries is drawn beside it as a
82
+ number with an arrow. No mouse gesture moves a scan by accident.
83
+ - **Nothing is normalised.** The y axis is mW, W/g or W/mol, with real
84
+ numbers on it. A DSC baseline depends on the mass, the pan and the heating
85
+ rate, and scaling each trace to its own extremum would hide exactly the
86
+ differences a stack is for.
87
+ - **Per mole is opt-in.** W/mol needs a molar mass, there is no default, and
88
+ a scan that has not been given one is drawn as a dashed placeholder with a
89
+ blinking red label instead of being plotted wrong. An export of a figure
90
+ with one in it carries a `NO MOLAR MASS` notice on the image and on the
91
+ console.
92
+ - **A legend when you want one** (tick it in the outliner): a colour sample and a name per
93
+ drawn scan, taking each scan's own label. It is an artist, so it is dragged
94
+ and anchored like the rest, and it starts off.
95
+ - **Labels can belong to a line.** Right-click a curve and add one: it
96
+ takes that line's colour, is listed under it in the outliner, and is
97
+ removed with it. Free-standing captions (`Ctrl+T`) work the same way
98
+ otherwise.
99
+ - **Artists carry a transform.** Everything that augments the figure rather
100
+ than coming from the data - the heat-flow arrow, a caption, whatever comes
101
+ next - derives from one base class with a position, an anchor and per-kind
102
+ capability flags. A position can be given as a fraction of the plot or in
103
+ the axes' own units, and switching between them does not move anything.
104
+ - **The heat-flow arrow is an object too.** Label it "exo down", "exo up",
105
+ "endo up" or "endo down"; the curves and the y axis follow the label, so
106
+ the arrow and the data cannot contradict each other.
107
+ - **The exotherm direction is read from the file** where the file says it (a
108
+ `.txt` export states it in the header; a `.tri` carries TRIOS's audit line),
109
+ and reported as assumed where it does not.
110
+
111
+ ## Keys
112
+
113
+ | Key | What it does |
114
+ | :-- | :-- |
115
+ | click | select what is under the pointer (`Shift` adds) |
116
+ | drag from a curve | **mark an interval**; let go and pick the analysis |
117
+ | drag from an artist | move it: the arrow, the legend, a label, an analysis label, an axis caption |
118
+ | drag from empty space | **box select** (with `Shift`, a box from anywhere, adding) |
119
+ | double-click | settings: a curve, an analysis, an axis spine, a caption |
120
+ | two-finger swipe, mouse wheel, or middle-button drag | scale the y axis about y = 0 (drag up: taller) |
121
+ | `Shift` + swipe or middle drag | pan the view, in whichever direction the hand goes |
122
+ | pinch, `Ctrl` + wheel or middle drag | zoom both axes about the pointer (Windows sends a pinch as `Ctrl+wheel`) |
123
+ | `Alt` + swipe or middle drag | zoom the page, like a document; with `Shift`, move it (`Alt+F` fits it again) |
124
+ | `Z` | cycle zoom: box, horizontal, vertical (`Esc` leaves) |
125
+ | `P` | cycle pan: horizontal, vertical, free |
126
+ | `F` / `Home` | fit the view, with room for every analysis label shown |
127
+ | `Esc` | back to plain select |
128
+ | `G` | grab the selection: move, or type a number, `Enter` to confirm - the only way a scan moves |
129
+ | `X` / `Y` while moving | lock a direction (a scan only moves in y) |
130
+ | `Shift` / `Ctrl` while moving | precision / snap to round numbers |
131
+ | `R` | reset the selected offsets to zero (or all of them) |
132
+ | a number | move the selected scans by it; `Enter` confirms, `Esc` cancels |
133
+ | `Ctrl+T` | add a caption where the cursor is |
134
+ | `Ctrl+Shift+T` | add a note: a caption with an arrow to the point under the cursor (on a curve, it belongs to that scan); drag the ring at its tip to re-aim it |
135
+ | `S` with only scans selected | spread them evenly about y = 0; type the step, `Ctrl` for a round one |
136
+ | `Ctrl+P` / `Alt+P` | give the selected labels to the selected scan (they then move with it) / free them; or drag a label onto a scan in the outliner |
137
+ | double-click a page handle | type the figure's size in cm or inches, the aspect ratio kept |
138
+ | `Ctrl+L` / `Ctrl+R` / `Ctrl+M` | align analysis labels left / right / centred on their arrows |
139
+ | `C` | measure by typing: two temperatures, then `Enter` |
140
+ | `Delete` | remove the selection: an analysis, a caption, or scans |
141
+ | `Ctrl+A` / `Alt+A` | select everything / nothing; `Shift+click` adds |
142
+ | `H` / `Alt+H` | hide the selection / show everything |
143
+ | `Shift+M` | set the molar mass |
144
+ | `N` | show or hide the outliner |
145
+ | `F3` | **operator search**: everything, filtered by what is selected |
146
+ | `Ctrl+Z` / `Ctrl+Y` | undo / redo, including a file you removed - and zoom, pan and fit, one gesture at a time |
147
+ | `Ctrl+S` / `Ctrl+E` | save the session / export the figure |
148
+ | `Ctrl+,` | settings: the house style, for every figure and for this one |
149
+ | `Ctrl+W` | close the pop-up in front; the window only when no pop-up is open |
150
+
151
+ The rule is short on purpose: **a drag acts on what it starts near.**
152
+ "Near" is the pick distance (Settings > Handling, 14 px unless you change
153
+ it): start within it of a curve and the drag marks an interval; of a label,
154
+ the arrow or the legend and it moves that; anywhere else it draws a box. A
155
+ click selects, a double-click opens settings. A scan moves with `G` and
156
+ nothing else, and an analysis label moves up or down only, with its leader
157
+ arrow stretching to follow.
158
+
159
+ The menu bar is File, Edit, **Search** (the same as `F3`) and Help (About).
160
+ Everything else lives in the search, filtered by what is selected.
161
+
162
+ Right-click a curve for its settings, its molar mass, a label or a note;
163
+ right-click an axis's number to hide it (its tick stays).
164
+
165
+ The figure follows the DSC_Plotter template: no grid, ticks pointing inward
166
+ with minor ticks, an italic `T` against an upright unit, and integrations
167
+ shaded between the curve and their baseline. All of it is editable per object,
168
+ and the x axis can be drawn in degrees Celsius, Kelvin or Fahrenheit.
169
+
170
+ ## Measuring
171
+
172
+ Press on a curve and drag along it (a double-click-drag works too): the
173
+ stretch between the two crosshairs is the interval. Let go, and a short list opens under the pointer -
174
+ Onset, Integration, Glass transition and the rest; one click, or type and
175
+ `Enter`. The analysis is computed, drawn and added to the outliner at once,
176
+ and it is one undo step. `Esc` on the list drops the interval.
177
+
178
+ To give the temperatures as numbers instead, select one scan and press `C`,
179
+ then type a temperature for each crosshair (in whatever unit the axis is
180
+ showing) and `Enter`; `Esc` steps back one stage at a time.
181
+
182
+ Double-clicking an analysis made here brings its cursors back as gizmos,
183
+ with its settings opened beside them rather than over them. Drag a gizmo
184
+ and the analysis is recomputed as you let go; close the settings - OK,
185
+ Cancel or the window's X - and the interval is confirmed and the gizmos go.
186
+
187
+ The arithmetic is `trios_analysis`, the same code the reader uses for the
188
+ analyses TRIOS stored, so a measurement made here and one read out of a `.tri`
189
+ are the same kind of thing. Against a stored integration in a reference run
190
+ the panel computes 13.3 J/g where the file says 13.2611.
191
+
192
+ Each analysis marks its interval with a dash on the curve at each end, in
193
+ the axis colour; an onset, endset or glass transition also gets straight
194
+ lines from those dashes to its result point, the template's construction
195
+ (one tickbox hides them). A cursor can be picked up and dragged rather than
196
+ replaced. Adjusting an existing analysis keeps the model it already has.
197
+ Analyses made here are saved with the session and recomputed from the file
198
+ when it is reopened.
199
+
200
+ A finished analysis arrives with its own caption - `\Delta*H* = 13.247 J/g`,
201
+ `*T*_{g} = 78.9 degC` - which is editable text in its settings. Captions
202
+ anywhere in the figure take the same small markup: `*T*` for italic, `_{g}`
203
+ for a subscript, and a backslash name for a Greek letter.
204
+
205
+ **Hiding the ends of a curve** (Scan settings > Hide) is the plotter's
206
+ `x_truncate`: the first and last N % of the POINTS, never a temperature
207
+ window - a DSC curve doubles back at its start and runs backwards when
208
+ cooling. The hidden ends show dashed while the scan is hovered or selected,
209
+ and are left out of the fit, the analyses and the exports. For the same
210
+ reason an interval dragged along a curve is the stretch of points between
211
+ where the drag began and ended, not every point between two temperatures.
212
+
213
+ The caption's **alignment** is the plotter's `flush`: which edge of the text
214
+ sits on the leader arrow. Left reads away to the right of the feature, right
215
+ to the left, centred hangs over it. By default it follows the analysis kind
216
+ as the template does - tangent constructions (onset, endset, glass
217
+ transition) flush left, integrals centre.
218
+
219
+ ## House style
220
+
221
+ `Ctrl+,` (Edit > Settings) sets the sizes and the label alignment, in two
222
+ columns:
223
+
224
+ - **Default** is yours: kept on this computer, used by every figure, and
225
+ there the next time the program starts. The **pick distance** lives here
226
+ too, under Handling: it is about your hand, not about a figure.
227
+ - **This figure** is saved in the session file and wins over the default,
228
+ for this figure only. Left on "default", it follows the column beside it.
229
+
230
+ A size chosen in an object's own settings (double-click it) wins over both,
231
+ and its **Default** button hands it back. The **caption distance** is the
232
+ space between an axis's numbers and its caption.
233
+
234
+ Every settings window applies as you touch it and keeps the changes however
235
+ it is closed; its **Revert** button is the one way back. Closing the program
236
+ with unsaved changes asks first.
237
+
238
+ ## Figure size
239
+
240
+ Edit > **Figure size and margins** (saved with the session) gives the figure
241
+ one of three sizes: whatever the window is, a fixed aspect ratio, or an
242
+ **exact size** in centimetres or inches with four margins. At an exact size
243
+ the margins decide the axes box - the numbers and captions live inside them,
244
+ and the dialog says when one does not fit - so two figures with the same
245
+ settings have identical axes boxes whatever their numbers say, and sit side
246
+ by side in Word without adjusting. On screen the figure is shown as its page,
247
+ scaled to fit. **Use for new figures** makes a layout the default.
248
+
249
+ Each axis can sit on either side (x bottom or top, y left or right) and hide
250
+ its numbers, single numbers or its caption (double-click the axis line or
251
+ its numbers). On an exact figure an axis moved to its other side takes its
252
+ margin with it, and no margin can be cut into the numbers it holds - the
253
+ one at the corner of the box included.
254
+
255
+ ## Exports
256
+
257
+ | Export | What it is for |
258
+ | :-- | :-- |
259
+ | PNG / SVG | the figure, drawn in the light palette, warnings stamped on; at an exact size, exactly that size (the PNG carries its dpi, the SVG its millimetres) |
260
+ | CSV | the curves as numbers, one x/y column pair per scan |
261
+ | `DSC_Plotter.py` | the arrangement as a driver script for the DSC_Plotter matplotlib template |
262
+
263
+ The driver needs that template's `achdsc` package, which is not on PyPI.
264
+ With it installed the export is a complete, runnable `DSC_Plotter.py` with
265
+ your paths, segments, colours and offsets already in it; without it, the
266
+ driver section alone, to paste into a copy made by `dsc -c .`.
267
+
268
+ ## The Start Menu, aliases, and the name
269
+
270
+ The name lives in exactly one module (`src/dscpanel/branding.py`) and a test
271
+ fails if it is hard-coded anywhere else; that is how DSC-Panel became
272
+ Triplot. Putting the program in the Start Menu is opt-in and reversible,
273
+ and it writes down what it created, so a rename can take the old name away:
274
+
275
+ ```bash
276
+ triplot register # Start Menu entry (add --desktop for one there too)
277
+ triplot register --list # what is registered
278
+ triplot register --remove # take it away again
279
+ triplot register --clean-legacy # after a rename: remove the old name's entries
280
+ ```
281
+
282
+ Your own name for it, on any platform (a `.cmd` shim on Windows, a symlink in
283
+ `~/.local/bin` elsewhere):
284
+
285
+ ```bash
286
+ triplot alias tp
287
+ triplot alias tp --remove
288
+ ```
289
+
290
+ ## Project layout
291
+
292
+ ```
293
+ src/dscpanel/
294
+ branding.py every place the program says its own name
295
+ register.py Start Menu entry, aliases, and the manifest of both
296
+ core/ UI-free: model, units, arranging, undo, session, export
297
+ trios_io.py the TRIOS reader (docs/TRI-FORMAT.md)
298
+ trios_analysis.py the TRIOS analyses, recomputed
299
+ ui/ the painted plot, the outliner, the F3 palette, dialogs
300
+ docs/PLAN.md what is built, what is next, what is still undecided
301
+ docs/TRI-FORMAT.md the binary .tri format, and how it was decoded
302
+ docs/OPERATORS.md every operator, its key and when it lights up
303
+ ```
304
+
305
+ ## Development
306
+
307
+ ```bash
308
+ python -m pytest -q
309
+ ```
310
+
311
+ Measurements are not committed. The tests that need a real `.tri` look for
312
+ paths in `TRIOS_TESTDATA` or in an uncommitted `tests/local_testdata.txt`,
313
+ and skip when there are none. They name a real file by a hash of its file
314
+ name (`tests/conftest.py`, `hashed_name`), so no sample id is in the
315
+ source.
@@ -0,0 +1,44 @@
1
+ dscpanel/__init__.py,sha256=IFYBvDE2taAT71MEtbAi3Axvwjbm4t_ttA-TD0fHK9M,123
2
+ dscpanel/__main__.py,sha256=7URpkErPnLotLTgQXZcC4Va8DaqG7IJbDjWgwf3tXKw,6245
3
+ dscpanel/branding.py,sha256=cCuBgolO2LUo_Hlz4Dj5fUbaqJAxs1p4RRldht0kd2M,6085
4
+ dscpanel/register.py,sha256=jAUF6Ms_IsCtsKiA8llI1CXOYjOdc0hUR6vOSTscrLk,10845
5
+ dscpanel/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ dscpanel/core/arrange.py,sha256=LQeePJQRBuJeOFwcKdEFX5JEA3zL9EflOXU0N_Sm898,5271
7
+ dscpanel/core/chem.py,sha256=aP5oAbDq1TW45CGkZOX3ojbBo5VJuamA409BP54fW1M,10268
8
+ dscpanel/core/dtg.py,sha256=AY_HCbAuwowZxdDOLI-c0TiKW4yUKrI06WnxIDRbVMI,5185
9
+ dscpanel/core/export.py,sha256=zZ7GN8mk9PYm5_ffiSmGhxLF15ARJiT4olx8a-dvE7k,30535
10
+ dscpanel/core/figure.py,sha256=mgOW6dw4ezQHM8n5pUlOhwKtVUPkuouXtPDJFfVBAuw,6900
11
+ dscpanel/core/labels.py,sha256=36g9v2XLOi7u8RrRFg4PPEJeLkyNFb5JDTFQdD-1jAU,18085
12
+ dscpanel/core/loader.py,sha256=Eopazh3xMG_WqUi63T98GyUS1fKNrSj7sIer-FZWadY,8361
13
+ dscpanel/core/log.py,sha256=UXkKACcfhQTpBG00Oub6hR1sK0iD1NTx9lwxxBz163A,5577
14
+ dscpanel/core/measure.py,sha256=Afydsuc-CfA95w6ZHVxKngkOA-3165pf1gT3e8_SPBE,26295
15
+ dscpanel/core/model.py,sha256=5IbxsxkKmIxe6Uq14xqBpTB7WkSWZaqVSxdKCvCJ3uY,90038
16
+ dscpanel/core/molar.py,sha256=FhhswyT3Q_4ea2Ohiw8a5_AvPG7uSDgqT_tWPJ3GPv8,12192
17
+ dscpanel/core/numbers.py,sha256=VTBIMJzArqTlYNCm2vWywRqDND-EvB_qrvBHT6_nrHg,7965
18
+ dscpanel/core/ops.py,sha256=vAfeogn3etAHJi0C1y6sXypWkF5zndaqeTb538itas4,6970
19
+ dscpanel/core/presets.py,sha256=mEmadm4JsgzgPxORz4bK_OdBSOsovh_zthu-nIDQuDM,12632
20
+ dscpanel/core/profile.py,sha256=wKNuLV7wO9KcexIcZnSCguZF5e8-zU9WOkN6TQxXNWM,576
21
+ dscpanel/core/session.py,sha256=gTbWFGWLN_0s-MtvcRwg4y_gJ1qR88lhBc7DraiLcc8,31981
22
+ dscpanel/core/shades.py,sha256=0KJtUFrOxTE57c2AWvoCYxzgdy2rDiKttyY4Q4SSZkE,1884
23
+ dscpanel/core/style.py,sha256=1uaI8Gh_j3FmDdJMyLZltB3Fg9F2CLRS1jvUV87OjIU,22270
24
+ dscpanel/core/trios_analysis.py,sha256=RQG1X3tvVvdAIC8JMHX9y-oFfpgrJClB2loO6XxBrF8,26863
25
+ dscpanel/core/trios_io.py,sha256=S3cyIvt9iQ9nGQbM3GsPb-RyWDyF35r23ZdS6bc4Ci4,59793
26
+ dscpanel/core/undo.py,sha256=ieQYNMsX3ijHsOeZ2MGec3ttn51LQxYxX8vinJZCD34,7612
27
+ dscpanel/core/units.py,sha256=BhHOIITrY3w5qW7lr7rmaclwMprh-3mk2FoijX5A2Xs,8449
28
+ dscpanel/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
+ dscpanel/ui/appearance.py,sha256=80ftnhtiHJwX_apoMf4VQ9AAoQOcM3oFZupLGSmOkXU,6140
30
+ dscpanel/ui/colour.py,sha256=18LtiT-4VxGsL_O6rBwFV9kbsWDxFMn83aXTRp3ACOo,24051
31
+ dscpanel/ui/dialogs.py,sha256=hfU_Uuwc5Tx8McJuUQ00WHvhXEDB9YlTos_cyC6HDQg,150689
32
+ dscpanel/ui/loading.py,sha256=4sckQ7KOJdjA_vvJEjP4GlF3Zgb3n54MqjxlFOFA2CY,3484
33
+ dscpanel/ui/numbox.py,sha256=-FR02Q7dChCt7troP8iOLmC9U-dmOIgfNKAWKB6CLMg,3260
34
+ dscpanel/ui/outliner.py,sha256=zNot_7IHFmt79tqPff6-cPQeRz7adWOR3M2UEALzfdc,35515
35
+ dscpanel/ui/palette.py,sha256=2lzQ486t08eHoIDkh6RO54704onugrKvG9kjlUeA5-Y,8540
36
+ dscpanel/ui/plot.py,sha256=5F1qcTbYoCqtAD4SOKMzAFM1L8qkfedrSEqiwwj3FAg,369989
37
+ dscpanel/ui/settings.py,sha256=Veoe0YJdvIEwhYB93gBpw0mIKu3ITYULamT0nWvcwY0,11215
38
+ dscpanel/ui/window.py,sha256=83f-OTzmPXh0kj0W9dBWAILWxzyNoRaq1PMSR0mcirM,188231
39
+ triplot-1.1.0.dist-info/licenses/LICENSE,sha256=ZghEH4BJPT8D2JXs-NCJJUBBMENIvZ04bBXAJxzcoRA,1189
40
+ triplot-1.1.0.dist-info/METADATA,sha256=1r3YAhllZo9Op7OwUCjZzYqXP77xE5M_98v0_x_fcVk,16631
41
+ triplot-1.1.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
42
+ triplot-1.1.0.dist-info/entry_points.txt,sha256=rtfmuSZonHvrHpbvd93brsS3NkJKclwhOQ6iuOfg-Zg,103
43
+ triplot-1.1.0.dist-info/top_level.txt,sha256=vNWML-M3YKOaR4ofunR0wSnJcfMHAYQw63CFNLRI7jg,9
44
+ triplot-1.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,5 @@
1
+ [console_scripts]
2
+ triplot = dscpanel.__main__:main
3
+
4
+ [gui_scripts]
5
+ triplot-gui = dscpanel.__main__:main
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Christian Nelle, Arbeitsgruppe Prof. Sebastian Henke,
4
+ Fakultät für Chemie und Chemische Biologie, Technische Universität Dortmund
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ dscpanel