Hide
Position
Light
More
Focus
Device
3D
=== sub indices ===
^ Key ^ Human Key ^ Subindex ^ Abbr ^ GDTF ^
| shutter | Shutter | 101 | sht | Shutter1 |
| strobe | Strobe | 102 | St | StrobeRate,Strobe1 |
| wh1 | Gobo Wheel | 130 | gW | Gobo1 |
| wh1rot | Gobo Rotation | 131 | gWr | Gobo1PosRotate |
| wh1fun | Gobo Function | 132 | gWf | |
| wh2rot | Gobo 2 Rotation | 134 | gW2r | Gobo2PosRotate |
| wh2fun | Gobo 2 Function | 135 | gW2f | |
| shut1a | Shutter 1 | 151 | sh1 | Blade1A |
| shut1b | Shutter 1b | 152 | sh1b | Blade1B,Blade1Rot |
| shut2a | Shutter 2 | 153 | sh2 | Blade2A |
| shut2b | Shutter 2b | 154 | sh2b | Blade2B,Blade2Rot |
| shut3a | Shutter 3 | 155 | sh3 | Blade3A |
| shut3b | Shutter 3b | 156 | sh3b | Blade3B,Blade3Rot |
| shut4a | Shutter 4 | 157 | sh4 | Blade4A |
| shut4b | Shutter 4b | 158 | sh4b | Blade4B,Blade4Rot |
| shutrot | Shutter Rotation | 160 | shr | ShaperRot |
| spd_c | Color Speed | 171 | clrspd | ColorMixMSpeed |
| spd_pt | Pan/Tilt Speed | 172 | p/tspd | PositionMSpeed |
| spd_b | Beam Speed | 174 | bmspd | IrisMSpeed,ZoomMSpeed |
| spd_e | Edge Speed | 175 | edgspd | FocusMSpeed |
| spd_fn | Fan Speed | 177 | fnspd | |
| fx | FX | 180 | FX | |
| fx1rot | Wheel 1 Rotation | 183 | wh1r | |
| prism | Prism | 189 | pri | Prism1 |
| cntl | Control | 190 | cntl | Control1 |
| mac | Macros | 191 | mac | |
| mac_c | Color Macros | 192 | Cmac | ColorMacro1 |
| reset | Reset | 199 | Rst | FixtureCalibrationReset |
| Mode | Mode | 200 | mode | Mode |
=== lt info fields ===
^ Key ^ Human Key ^ Inner ^ Single ^ Numeric ^ Angle ^ Dist ^ Category ^ Subindex ^ Abbr ^ GDTF ^ Control ^ Font Name ^ Font Size ^ RPT ^
| hang | Position | | | | 0.0 | 0.0 | 2 | | | | | Helvetica | 10 | |
| num | # | y | | y | 0.0 | 0.0 | 2 | | | | | Helvetica | 6 | |
| color | Color | | | | 0.0 | 7.0 | 2 | 2 | frame | Color1 | y | Times-Italic | 9 | |
| color2 | Frost | | | | 0.0 | 14.0 | 3 | 9 | | Frost1 | y | Times-Roman | 9 | |
| chan | Channel | | | y | 180.0 | 8.0 | 2 | | | | | Helvetica-Bold | 9 | |
| chpt | Channel Part | | | y | 0.0 | 0.0 | 0 | | | | | Helvetica | 12 | |
| cir | Circuit | | | y | 180.0 | 20.0 | 3 | | | | | Helvetica | 10 | |
| dim | Address | | | y | 180.0 | 20.0 | 2 | | | | | Helvetica | 10 | |
| gobo | Template | | | | 0.0 | 20.0 | 2 | 10 | gobo | Gobo1 | y | Helvetica | 10 | |
| use | Use | | | | 0.0 | 20.0 | 2 | | | | | Helvetica | 10 | |
| grp | Group | | | | 0.0 | 0.0 | 2 | | | | | Helvetica | 10 | |
| mk | Mark | y | | | 0.0 | 6.0 | 3 | | | | | Helvetica | 6 | |
| note | Note | | | | 0.0 | 0.0 | 3 | | | | | Helvetica | 10 | |
| user1 | User Data | | | | 0.0 | 0.0 | 0 | | | | | Helvetica | 12 | |
| user2 | User Data 2 | | | | 0.0 | 0.0 | 0 | | | | | Helvetica | 12 | |
| user3 | User Data 3 | | | | 0.0 | 0.0 | 0 | | | | | Helvetica | 12 | |
| userF1 | Focus Center | | | | 0.0 | 0.0 | 0 | | | | | Helvetica | 12 | |
| userF2 | Focus Beam | | | | 0.0 | 0.0 | 0 | | | | | Helvetica | 12 | |
| userF3 | Focus Cuts | | | | 0.0 | 0.0 | 0 | | | | | Helvetica | 12 | |
| foc_x | Focus X | | | | 0.0 | 0.0 | 4 | | | | | Helvetica | 10 | |
| foc_y | Focus Y | | | | 0.0 | 0.0 | 4 | | | | | Helvetica | 10 | |
| foc_z | Focus Height | | | | 0.0 | 0.0 | 4 | | | | | Helvetica | 10 | n |
| glr | Rendering | | | | 0.0 | 0.0 | 6 | | | | | Helvetica | 12 | n |
| edge | Edge | | | | 0.0 | 0.0 | 4 | 13 | edge | Focus1 | y | Helvetica | 12 | n |
| vbeam | Spot/Flood | | | | 0.0 | 0.0 | 4 | 8 | zoom | Zoom | y | Helvetica | 10 | n |
| vcd | Cd@Spot/Flood | | | | 0.0 | 0.0 | 4 | 11 | vCd | | y | Helvetica | 10 | n |
| foc_a | Beam Axis | | | | 0.0 | 0.0 | 4 | 12 | Bma | ShaperRot | y | Helvetica | 10 | |
| chans | Channels | | | | 0.0 | 0.0 | 0 | | | | | Helvetica | 12 | |
| owner | Owner ID | | | | 0.0 | 0.0 | 5 | | | | | Helvetica | 10 | |
| dtable | Parameters | | | | 0.0 | 0.0 | 5 | | | | | Helvetica | 12 | |
| mpan | Pan | | | | 0.0 | 0.0 | 5 | 3 | pan | Pan | y | Helvetica | 12 | n |
| mtilt | Tilt | | | | 0.0 | 0.0 | 5 | 5 | tilt | Tilt | y | Helvetica | 12 | n |
| vbm_per | Iris% | | y | | 0.0 | 0.0 | 5 | 7 | iris | Iris | y | Helvetica | 12 | n |
| intensity | Intensity | | | | 0.0 | 0.0 | 5 | 1 | int% | Dimmer | y | Helvetica | 12 | n |
| mixHue | Hue | | | | 0.0 | 0.0 | 5 | 19 | hue | HSB_Hue | y | Helvetica | 12 | n |
| mixSat | Saturation | | | | 0.0 | 0.0 | 5 | 20 | sat. | HSB_Saturation | y | Helvetica | 12 | n |
| mixCy | Cyan | | | | 0.0 | 0.0 | 5 | 21 | Cy | ColorSub_C,ColorAdd_C,ColorRGB_Cyan | y | Helvetica | 12 | n |
| mixCIEx | Color X | | | | 0.0 | 0.0 | 5 | 17 | cX | CIE_X | y | Helvetica | 12 | n |
| mixCIEy | Color Y | | | | 0.0 | 0.0 | 5 | 18 | cY | CIE_Y | y | Helvetica | 12 | n |
| mixMg | Magenta | | | | 0.0 | 0.0 | 5 | 22 | Mg | ColorSub_M,ColorAdd_M,ColorRGB_Magenta | y | Helvetica | 12 | n |
| mixYl | Yellow | | | | 0.0 | 0.0 | 5 | 23 | Yl | ColorSub_Y,ColorAdd_Y,ColorRGB_Yellow | y | Helvetica | 12 | n |
| mixRd | Red | | | | 0.0 | 0.0 | 5 | 24 | Rd | ColorAdd_R,ColorRGB_Red | y | Helvetica | 12 | n |
| mixGn | Green | | | | 0.0 | 0.0 | 5 | 25 | Gn | ColorAdd_G,ColorRGB_Green | y | Helvetica | 12 | n |
| mixBl | Blue | | | | 0.0 | 0.0 | 5 | 26 | Bl | ColorAdd_B,ColorRGB_Blue | y | Helvetica | 12 | n |
| mixRo | Red-Orange | | | | 0.0 | 0.0 | 5 | 27 | Ro | | y | Helvetica | 12 | n |
| mixAm | Amber | | | | 0.0 | 0.0 | 5 | 28 | Am | ColorAdd_RY,ColorAdd_A | y | Helvetica | 12 | n |
| mixIn | Indigo | | | | 0.0 | 0.0 | 5 | 29 | Ig | ColorAdd_BM | y | Helvetica | 12 | n |
| mixWh | White | | | | 0.0 | 0.0 | 5 | 30 | Wh | ColorAdd_W | y | Helvetica | 12 | n |
| mixWW | Warm White | | | | 0.0 | 0.0 | 5 | 31 | wW | ColorAdd_WW | y | Helvetica | 12 | n |
| mixCW | Cool White | | | | 0.0 | 0.0 | 5 | 32 | cW | ColorAdd_CW | y | Helvetica | 12 | n |
| mixLm | Lime | | | | 0.0 | 0.0 | 5 | 33 | Lm | ColorAdd_GY,ColorAdd_L | y | Helvetica | 12 | n |
| mixUV | UV | | | | 0.0 | 0.0 | 5 | 34 | uv | ColorAdd_UV | y | Helvetica | 12 | n |
| adj_x | X offset | | | | 0.0 | 0.0 | 6 | | | | | Helvetica | 12 | n |
| adj_y | Y offset | | | | 0.0 | 0.0 | 6 | | | | | Helvetica | 12 | n |
| adj_z | Z offset | | | | 0.0 | 0.0 | 6 | | | | | Helvetica | 12 | n |
| ipaddr | IP Address | | y | | 0.0 | 9.0 | 5 | | | | | CourierNewPSMT | 12 | |
| mode | Mode | | | | 0.0 | 0.0 | 5 | | | | | ArialNarrow | 12 | |
| univ | Universe | | | y | 180.0 | 7.0 | 5 | | | | | Arial-Black | 12 | |
=== pos info fields ===
^ Key ^ Human Key ^ Inner ^ Single ^ Angle ^ Dist ^ Category ^ Font Name ^ Font Size ^
| pname | Name | y | | 0.0 | 10.0 | 1 | Helvetica-BoldOblique | 12 |
| ht | Height | y | | 0.0 | 0.0 | 1 | Helvetica | 10 |
| n_o | Numbering | y | | 0.0 | 0.0 | 0 | Helvetica | 10 |
| l_o | Layout | y | | 0.0 | 0.0 | 0 | Helvetica-BoldOblique | 12 |
| space | Spacing | y | | 0.0 | 0.0 | 1 | Helvetica | 12 |
| l_off | Offset Layout | y | | 0.0 | 0.0 | 0 | Helvetica | 12 |
| pnote | Note | y | y | 0.0 | 0.0 | 1 | Helvetica | 10 |
| map_st_x | Map Start X | y | | 0.0 | 0.0 | 6 | Helvetica | 10 |
| map_st_y | Map Start Y | y | | 0.0 | 0.0 | 6 | Helvetica | 10 |
| map_st_z | Map Start Z | y | | 0.0 | 0.0 | 6 | Helvetica | 10 |
| map_ed_x | Map End X | y | | 0.0 | 0.0 | 6 | Helvetica | 10 |
| map_ed_y | Map End Y | y | | 0.0 | 0.0 | 6 | Helvetica | 10 |
| map_ed_z | Map End Z | y | | 0.0 | 0.0 | 6 | Helvetica | 10 |
| map_axis | Map Axis | y | | 0.0 | 0.0 | 6 | Helvetica | 12 |
==== Examples ====
===== template =====
#Thu Jan 15 16:34:27 CET 2026
#Thu Jan 15 16:34:27 CET 2026
misc
toto
4b6ca21a-1202-4b37-9121-281572b09a7d
LXGroup
LXShape
144.0
452.0
86.0
135.0
0.0
y
1.0
0.0,0.0,0.0,1.0
y
1.0,1.0,1.0,1.0
0
n
LXLineShape
130.0
550.0
132.0
1.0
0.0
y
1.0
0.0,0.0,0.0,1.0
y
1.0,1.0,1.0,1.0
0
n
130.0
550.0
262.0
551.0
4.2
#Tue Apr 30 09:39:12 CEST 2024
#Tue Apr 30 09:39:12 CEST 2024
zers
17
750
104
HPL750
7.5"
29
21
s42550
46
-1'-6"
27
63480
150745
ETC 42550
25-50° Source Four Zoom
zers
714sx2
rj714sx2
CP92
23.2
4b6ca21a-1202-4b37-9121-281572b09a7d
8.46"
52000
RJ 714sx2
2000
2kw = cp92 52000lm / 2500w = cp91 65000lm
40
40
15
15
4b6ca21a-1202-4b37-9121-281572b09a7d
LXGroup
LXPathShape
0.0
452.0
0.0
0.0
0.0
y
0.5
0.13725491,0.12156863,0.1254902,1.0
n
1.0,1.0,1.0,1.0
0
n
mv
353.0544
355.66608
ln
353.0544
354.1274
ln
350.5011
354.1274
ln
350.5011
342.61172
ln
353.0544
342.60477
ln
353.0544
354.1274
ln
353.0544
341.08002
ln
353.0544
360.82
ln
354.91
360.82
ln
354.91
348.36194
ln
368.8275
348.36194
ln
368.83447
350.4941
ln
355.91492
350.4941
ln
355.91492
352.20792
ln
368.8275
352.20792
ln
368.8275
353.92865
ln
355.91492
353.92865
ln
355.91492
346.3479
ln
368.83447
346.3479
ln
368.8275
344.45062
ln
355.91492
344.45062
ln
355.91492
353.92865
ln
355.91492
342.7396
ln
357.57452
342.7396
ln
357.57452
353.92865
ln
359.22717
353.92865
ln
359.22717
342.7396
ln
360.8812
342.7396
ln
360.8812
353.92865
ln
362.49493
353.92865
ln
362.48798
342.7396
ln
364.05722
342.7396
ln
364.05722
353.92865
ln
365.70987
353.92865
ln
365.70987
342.7396
ln
367.31665
342.7396
ln
367.31665
353.92865
ln
355.91492
353.92865
ln
368.8275
353.92865
ln
368.83447
352.20792
ln
368.83447
350.4941
ln
368.83447
348.36194
ln
368.83447
346.3479
ln
368.83447
344.45062
ln
368.83447
342.7396
ln
367.31665
342.7396
ln
365.70987
342.7396
ln
364.05026
342.7396
ln
362.48798
342.7396
ln
360.8812
342.7396
ln
359.22717
342.7396
ln
357.56757
342.7396
ln
355.91492
342.7396
ln
355.91492
348.36194
ln
354.91
348.36194
ln
354.91
341.0258
ln
354.91
335.89413
ln
354.91
355.65634
ln
369.85052
355.65634
ln
354.91
355.65634
ln
354.91
360.82
ln
369.74487
360.82
ln
367.79617
360.82
ln
367.79062
362.17657
ln
369.75183
362.17657
ln
369.75183
360.82
ln
371.7075
360.82
ln
369.85052
360.82
ln
369.85052
341.0258
ln
354.91696
341.0258
ln
354.91
335.88858
ln
369.75183
335.88858
ln
367.79062
335.88858
ln
367.79062
335.18246
ln
363.21075
333.24628
ln
363.21075
331.88275
ln
369.75183
333.95236
ln
369.75183
335.88858
ln
371.7075
335.88858
ln
371.7075
360.82
ln
371.7075
358.07626
ln
373.5311
358.0679
ln
373.55054
338.61285
ln
373.5311
363.36636
ln
373.5311
358.0679
ln
375.4075
358.0846
ln
375.4075
360.82
ln
375.4075
335.88858
ln
377.26447
335.88858
ln
377.26447
360.82
ln
375.4075
360.82
ln
401.34387
360.82
ln
399.46884
360.82
ln
399.46188
362.2169
ln
401.34387
362.2169
ln
401.34387
360.82
ln
406.90784
360.82
ln
406.90784
336.87125
ln
409.32214
336.87125
ln
409.32214
359.7984
ln
406.90784
359.7984
ln
409.32214
359.7984
ln
409.32214
336.87125
ln
406.90784
336.87125
ln
406.90784
335.88858
ln
395.83273
335.88858
ln
395.83273
334.1428
ln
394.0286
334.13446
ln
394.0286
335.88858
ln
395.8397
335.88858
ln
375.4075
335.88858
ln
375.4075
338.63928
ln
373.5311
338.63928
ln
373.5311
333.27826
ln
373.5311
338.63928
ln
371.7075
338.63928
ln
371.7075
335.88858
ln
369.85052
335.88858
ln
369.85052
341.0258
ln
354.91
341.0258
ln
354.91
335.88858
ln
353.0544
335.88858
ln
353.0544
341.07446
ln
349.16953
341.07446
ln
349.16953
355.66608
ln
353.0544
355.66608
zers
713sx2
rj713sx2
CP92
22
c24bcd83-1a40-4e48-87e2-56dfb7fba6ec
8.46"
52000
RJ 713sx2
2000
2kw = cp92 52000lm / 2500w = cp91 65000lm
50
29
50
29
c24bcd83-1a40-4e48-87e2-56dfb7fba6ec
LXGroup
LXPathShape
0.0
452.0
0.0
0.0
0.0
y
1.0
0.13725491,0.12156863,0.1254902,1.0
n
1.0,1.0,1.0,1.0
0
n
mv
352.79733
356.30347
ln
352.79733
354.7648
ln
350.301
354.7648
ln
350.301
343.23938
ln
352.79733
343.23105
ln
352.79733
354.7648
ln
352.79733
341.7035
ln
352.79733
361.46573
ln
354.61398
361.46573
ln
354.61398
348.99374
ln
368.22153
348.99374
ln
368.2299
351.12732
ln
355.59528
351.12732
ln
355.59528
352.8439
ln
368.22153
352.8439
ln
368.22153
354.56604
ln
355.59528
354.56604
ln
355.59528
346.97693
ln
368.2299
346.97693
ln
368.22153
345.07965
ln
355.59528
345.07965
ln
355.59528
354.56604
ln
355.59528
343.36307
ln
357.21735
343.36307
ln
357.21735
354.56604
ln
358.83524
354.56604
ln
358.83524
343.36307
ln
360.45316
343.36307
ln
360.45316
354.56604
ln
362.03073
354.56604
ln
362.02377
343.36307
ln
363.5569
343.36307
ln
363.5569
354.56604
ln
365.17477
354.56604
ln
365.17477
343.36307
ln
366.74683
343.36307
ln
366.74683
354.56604
ln
355.59528
354.56604
ln
368.22153
354.56604
ln
368.2299
352.8439
ln
368.2299
351.12732
ln
368.2299
348.99374
ln
368.2299
346.97693
ln
368.2299
345.07965
ln
368.2299
343.36307
ln
366.74683
343.36307
ln
365.17477
343.36307
ln
363.55133
343.36307
ln
362.02377
343.36307
ln
360.45316
343.36307
ln
358.83524
343.36307
ln
357.2118
343.36307
ln
355.59528
343.36307
ln
355.59528
348.99374
ln
354.61398
348.99374
ln
354.61398
341.65067
ln
354.61398
336.51343
ln
354.61398
356.2965
ln
369.2223
356.2965
ln
354.61398
356.2965
ln
354.61398
361.46573
ln
369.12085
361.46573
ln
367.2152
361.46573
ln
367.20828
362.8223
ln
369.12778
362.8223
ln
369.12778
361.46573
ln
371.03897
361.46573
ln
369.2223
361.46573
ln
369.2223
341.65067
ln
354.62094
341.65067
ln
354.61398
336.50647
ln
369.12778
336.50647
ln
367.20828
336.50647
ln
367.20828
335.799
ln
362.72986
333.86142
ln
362.72986
332.4965
ln
369.12778
334.5689
ln
369.12778
336.50647
ln
371.03897
336.50647
ln
371.03897
361.46573
ln
371.03897
358.7178
ln
372.82227
358.70944
ln
372.8417
339.23773
ln
372.82227
364.0121
ln
372.82227
358.70944
ln
374.6584
358.72614
ln
374.6584
361.46573
ln
374.6584
336.50647
ln
376.47363
336.50647
ln
376.47363
361.46573
ln
374.6584
361.46573
ln
391.29462
361.46573
ln
391.29462
337.4586
ln
393.58664
337.4586
ln
393.58664
360.41632
ln
391.29462
360.41632
ln
393.58664
360.41632
ln
393.58664
337.4586
ln
391.29462
337.4586
ln
391.29462
336.50647
ln
382.645
336.50647
ln
382.645
334.74405
ln
380.74078
334.74405
ln
380.74078
336.50647
ln
382.645
336.50647
ln
374.6584
336.50647
ln
374.6584
339.25998
ln
372.82227
339.25998
ln
372.82227
333.89478
ln
372.82227
339.25998
ln
371.03897
339.25998
ln
371.03897
336.50647
ln
369.2223
336.50647
ln
369.2223
341.65067
ln
354.61398
341.65067
ln
354.61398
336.50647
ln
352.79733
336.50647
ln
352.79733
341.69653
ln
349.0
341.69653
ln
349.0
356.30347
ln
352.79733
356.30347
4.2
==== Lib maker ====
made with claude.ai. create symbol with lxplan or import dxf then keep only one layer and then embed the symbol inside a group and then run the python script.
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
import xml.etree.ElementTree as ET
import os
class XMLExtractorApp:
def __init__(self, root):
self.root = root
self.root.title("XML Shape to Symbol Extractor")
self.root.geometry("600x600")
self.root.resizable(False, False)
self.input_file = None
self.tree = None
self.create_widgets()
def create_widgets(self):
# Title
title = tk.Label(self.root, text="XML Shape to Symbol Extractor",
font=("Arial", 16, "bold"))
title.pack(pady=10)
# Info label
info = tk.Label(self.root, text="Extracts from: /layers/layer/shape\nWrites to: /key/kentry/custom/symbol/group/shape",
font=("Arial", 9), fg="gray", justify=tk.CENTER)
info.pack()
# Input file frame
input_frame = tk.Frame(self.root)
input_frame.pack(pady=10, padx=20, fill=tk.X)
tk.Label(input_frame, text="Input LXXPLOT File:",
font=("Arial", 10)).pack(anchor=tk.W)
file_display_frame = tk.Frame(input_frame)
file_display_frame.pack(fill=tk.X, pady=5)
self.file_label = tk.Label(file_display_frame, text="No file selected",
fg="gray", anchor=tk.W)
self.file_label.pack(side=tk.LEFT, fill=tk.X, expand=True)
browse_btn = tk.Button(file_display_frame, text="Browse",
command=self.browse_file)
browse_btn.pack(side=tk.RIGHT)
# Output file frame
output_frame = tk.Frame(self.root)
output_frame.pack(pady=10, padx=20, fill=tk.X)
tk.Label(output_frame, text="Output LXKEY File:",
font=("Arial", 10)).pack(anchor=tk.W)
self.output_entry = tk.Entry(output_frame, font=("Arial", 10))
self.output_entry.pack(fill=tk.X, pady=5)
self.output_entry.insert(0, "symbol_output.lxkey")
# Additional fields frame
fields_frame = tk.Frame(self.root)
fields_frame.pack(pady=10, padx=20, fill=tk.X)
tk.Label(fields_frame, text="Additional Tag Values:",
font=("Arial", 10, "bold")).pack(anchor=tk.W, pady=(0, 5))
# Name field (displayed as "Type")
name_frame = tk.Frame(fields_frame)
name_frame.pack(fill=tk.X, pady=2)
tk.Label(name_frame, text="Type:", width=10, anchor=tk.W).pack(side=tk.LEFT)
self.name_entry = tk.Entry(name_frame, font=("Arial", 10))
self.name_entry.pack(side=tk.LEFT, fill=tk.X, expand=True)
# ID field
id_frame = tk.Frame(fields_frame)
id_frame.pack(fill=tk.X, pady=2)
tk.Label(id_frame, text="ID:", width=10, anchor=tk.W).pack(side=tk.LEFT)
self.id_entry = tk.Entry(id_frame, font=("Arial", 10))
self.id_entry.pack(side=tk.LEFT, fill=tk.X, expand=True)
# Fname field
fname_frame = tk.Frame(fields_frame)
fname_frame.pack(fill=tk.X, pady=2)
tk.Label(fname_frame, text="Fname:", width=10, anchor=tk.W).pack(side=tk.LEFT)
self.fname_entry = tk.Entry(fname_frame, font=("Arial", 10))
self.fname_entry.pack(side=tk.LEFT, fill=tk.X, expand=True)
# Kind field (dropdown)
kind_frame = tk.Frame(fields_frame)
kind_frame.pack(fill=tk.X, pady=2)
tk.Label(kind_frame, text="Kind:", width=10, anchor=tk.W).pack(side=tk.LEFT)
# Dictionary mapping display names to values
self.kind_options = {
"eko / ERS": "ers",
"Zoom Leko / ERS": "zers",
"Fresnel / PC": "fres",
"PAR": "par",
"Flood": "fl",
"Striplight": "strip",
"DMX Device": "scroll",
"Mirror": "mirror",
"Focus Point": "focus",
"Other": "misc",
"Automated Fixture": "mover",
"Color Mixing Automated Fixture": "cmymvr",
"Color Mixing Rectangular Beam (obsolete rgb)": "rgb",
"Color Mixing Rectangular Beam (obsolete rgba)": "rgba",
"Color Mixing Rectangular Beam": "led7",
"Color Mixing Striplight": "led7s",
"Color Mixing Leko / ERS": "cmers",
"Color Mixing Zoom ERS": "cmzers",
"Color Mixing DMX Device": "cmscroll",
"Network Device": "netnode"
}
self.kind_var = tk.StringVar()
self.kind_dropdown = ttk.Combobox(kind_frame, textvariable=self.kind_var,
values=list(self.kind_options.keys()),
state="readonly",
font=("Arial", 10))
self.kind_dropdown.pack(side=tk.LEFT, fill=tk.X, expand=True)
self.kind_dropdown.current(0) # Set default to first option
# Extract button
extract_btn = tk.Button(self.root, text="Extract and Convert",
command=self.extract_and_convert,
font=("Arial", 12, "bold"),
bg="#4CAF50", fg="white",
padx=20, pady=10)
extract_btn.pack(pady=20)
# Status label
self.status_label = tk.Label(self.root, text="",
font=("Arial", 9), fg="blue")
self.status_label.pack(pady=5)
def browse_file(self):
filename = filedialog.askopenfilename(
title="Select LXXPLOT File",
filetypes=[("LXXPLOT files", "*.lxxplot"), ("All files", "*.*")]
)
if filename:
self.input_file = filename
self.file_label.config(text=os.path.basename(filename), fg="black")
self.status_label.config(text="File loaded successfully", fg="green")
def extract_and_convert(self):
# Validate inputs
if not self.input_file:
messagebox.showerror("Error", "Please select an input LXXPLOT file")
return
output_filename = self.output_entry.get().strip()
if not output_filename:
messagebox.showerror("Error", "Please enter an output file name")
return
# Get the directory of the input file and create full output path
input_dir = os.path.dirname(self.input_file)
output_file = os.path.join(input_dir, output_filename)
try:
# Parse the LXXPLOT file (XML format)
tree = ET.parse(self.input_file)
root = tree.getroot()
# Find the shape tag using the xpath: /layers/layer/shape
shape_element = root.find("./layers/layer/shape")
if shape_element is None:
messagebox.showerror("Error",
"Path '/layers/layer/shape' not found in the LXXPLOT file")
return
# Create the new XML structure: /key/kentry/custom/symbol/group/shape
new_root = ET.Element("key")
kentry = ET.SubElement(new_root, "kentry")
# Add name, kind, and fname as siblings of custom with user-provided values
name = ET.SubElement(kentry, "name")
name.text = self.name_entry.get().strip()
id_elem = ET.SubElement(kentry, "id")
id_elem.text = self.id_entry.get().strip()
kind = ET.SubElement(kentry, "kind")
# Get the value corresponding to the selected display name
selected_display = self.kind_var.get()
kind.text = self.kind_options.get(selected_display, "")
fname = ET.SubElement(kentry, "fname")
fname.text = self.fname_entry.get().strip()
custom = ET.SubElement(kentry, "custom")
symbol = ET.SubElement(custom, "symbol")
group = ET.SubElement(symbol, "group")
shape = ET.SubElement(group, "shape")
# Copy the content from shape element to the new shape element
shape.text = shape_element.text
shape.attrib = shape_element.attrib
# Copy all child elements from original shape to new shape
for child in shape_element:
shape.append(child)
# Create and write the new LXKEY file
new_tree = ET.ElementTree(new_root)
ET.indent(new_tree, space=" ")
new_tree.write(output_file, encoding="utf-8", xml_declaration=True)
self.status_label.config(
text=f"Successfully converted and saved to {output_filename}",
fg="green"
)
messagebox.showinfo("Success",
f"Shape content extracted and written to /key/kentry/custom/symbol/group/shape\nSaved to: {output_file}")
except ET.ParseError as e:
messagebox.showerror("Parse Error",
f"Failed to parse XML file:\n{str(e)}")
self.status_label.config(text="Parse error", fg="red")
except Exception as e:
messagebox.showerror("Error", f"An error occurred:\n{str(e)}")
self.status_label.config(text="Error occurred", fg="red")
if __name__ == "__main__":
root = tk.Tk()
app = XMLExtractorApp(root)
root.mainloop()
==== js version ====
Lxplan lib builder
Lxplan lib builder
Cliquer içi pour lire la doc
Pour créer une librairie, il faut :
- Dessiner le symbole dans lxplan
- Le symbole doit etre sur le premier layer
- Une fois fini, le symbole doit etre dans un groupe
- Enregistrer le projet dans un fichier .lxxplot
- Utiliser ce script en important le fichier lxxplot puis en remplissant les champs obligatoires et
les autres si besoin
- Sauvegarder le fichier qui va donner un fichier .lxkey qui sera à mettre dans le dossier de la
bibliotheque (voir l'onglet "library" dans les options de lxplan)
Charger le fichier lxxplot
Sélectionnez un fichier llxplot sur votre appareil :
Tester le fichier lxxplot
Le fichier est il un lxxplot ? : ...
Le fichier possede t il une shape sur le premier layer ? :...
La shape, commence t elle par un groupe ? :...
Données de la librairie
Champs obligatoires
Champs optionnels
Cliquer içi pour editer les champs optionnels
Selectionner d'abord un type d'appareil