This is an old revision of the document!
lxplan
library
fields
graphic fields
| Key | Human Key |
|---|---|
| loc_x | Location X |
| loc_y | Location Y |
| loc_z | Location Z |
| size_w | Width |
| size_h | Height |
| start_x | Start X |
| start_y | Start Y |
| end_x | End X |
| end_y | End Y |
| len | Length |
| dir | Direction |
| ctl1_x | Control One X |
| ctl1_y | Control One Y |
| ctl2_x | Control Two X |
| ctl2_y | Control Two Y |
| scale_w | Width % |
| scale_h | Height % |
| draw_fl | Draw Fill |
| dr_st | Draw Stroke |
| fl_color | Fill Color |
| st_color | Stroke Color |
| st_w | Stroke Width |
| ln_style | Line Style |
| ch_font | Change Font |
| font | Font |
| rotate | Rotation |
| id | Key ID |
| loc_l | Left |
| loc_r | Right |
| loc_t | Top |
| loc_b | Bottom |
| start_z | Start Z |
| end_z | End Z |
| n_sides | Sides |
| crop_l | Crop Left |
| crop_r | Crop Right |
| crop_t | Crop Top |
| crop_b | Crop Bottom |
| 3dtype | Type |
report fields
| Key | Human Key |
|---|---|
| space | Space |
| color+frame | Color/Frame |
| color+type | Color/Type |
| pdist | Location |
| foc_pt | Focus Pt. |
| bnc_pt | Bounce Pt. |
| INPUT | Input |
| sheets | Sheets |
| full_cname | Full Color Name |
| patch | Patch |
| uuid | UUID |
| keep | Keep |
key fields
| Key | Human Key | RPT |
|---|---|---|
| name | Type | |
| fname | Full Name | |
| id | ID | n |
| sid | Symbol ID | |
| have | Inventory | |
| balance | Balance | |
| lamp | Lamp | |
| watts | Watts | |
| frame | Color Frame | |
| beam | Field Angle | n |
| bm_x | Field X | n |
| bm_y | Field Y | n |
| bm_w | Field Wide | n |
| bm_t | Field Tight | n |
| cd | Candela | n |
| cd_w | Candela Wide | n |
| cd_t | Candela Tight | n |
| abm | Beam Angle | n |
| abm_x | Beam X | n |
| abm_y | Beam Y | n |
| abm_w | Beam Wide | n |
| abm_t | Beam Tight | n |
| wt | Weight | |
| cpf | Sections Per Fixture | n |
| lpc | Lamps Per Circuit | n |
| dbl | Distance Between Lamps | n |
| note | More Info | |
| scroll | Device Params | n |
| dmode | Mode | n |
| mixtype | Mix Type | n |
| d_mk | Default Mark | n |
| acc_loc | Placement | n |
| d_adj_x | Default X Offset | n |
| d_adj_y | Default Y Offset | n |
| d_adj_z | Default Z Offset | n |
kinds
| Key | Human Key | Keyfields | Infofields |
|---|---|---|---|
| ers | Leko / ERS | name, fname, id, sid, have, lamp, watts, frame, beam, cd, abm, wt, note, d_mk, d_adj_x, d_adj_y, d_adj_z | hang, num, color, color2, chan, chpt, cir, dim, gobo, use, grp, mk, note, user1, user2, user3, userF1, userF2, userF3, foc_x, foc_y, foc_z, glr, adj_x, adj_y, adj_z |
| zers | Zoom Leko / ERS | name, fname, id, sid, have, lamp, watts, frame, bm_w, bm_t, cd_w, cd_t, abm_w, abm_t, wt, note, d_mk, d_adj_x, d_adj_y, d_adj_z | hang, num, color, color2, chan, chpt, cir, dim, gobo, use, grp, mk, note, user1, user2, user3, userF1, userF2, userF3, foc_x, foc_y, foc_z, glr, vbeam, vcd, adj_x, adj_y, adj_z |
| fres | Fresnel / PC | name, fname, id, sid, have, lamp, watts, frame, bm_w, bm_t, cd_w, cd_t, abm_w, abm_t, wt, note, d_mk, d_adj_x, d_adj_y, d_adj_z | hang, num, color, color2, chan, chpt, cir, dim, use, grp, mk, note, user1, user2, user3, userF1, userF2, userF3, foc_x, foc_y, foc_z, glr, vbeam, vcd, adj_x, adj_y, adj_z |
| par | PAR | name, fname, id, sid, have, lamp, watts, frame, bm_x, bm_y, cd, abm_x, abm_y, wt, note, d_mk, d_adj_x, d_adj_y, d_adj_z | hang, num, color, color2, chan, chpt, cir, dim, use, grp, mk, note, user1, user2, user3, userF1, userF2, userF3, foc_x, foc_y, foc_z, glr, foc_a, adj_x, adj_y, adj_z |
| fl | Flood | name, fname, id, sid, have, lamp, watts, frame, beam, cd, abm, wt, note, d_mk, d_adj_x, d_adj_y, d_adj_z | hang, num, color, color2, chan, chpt, cir, dim, use, grp, mk, note, user1, user2, user3, userF1, userF2, userF3, foc_x, foc_y, foc_z, glr, adj_x, adj_y, adj_z |
| strip | Striplight | name, fname, id, sid, have, lamp, watts, frame, bm_x, bm_y, cd, abm_x, abm_y, wt, cpf, lpc, dbl, note, d_mk, d_adj_x, d_adj_y, d_adj_z | hang, num, color, color2, chan, chpt, cir, dim, use, grp, mk, note, user1, user2, user3, foc_x, foc_y, foc_z, glr, foc_a, adj_x, adj_y, adj_z |
| scroll | DMX Device | name, fname, id, sid, have, note, scroll, dmode, d_mk, acc_loc | chan, chpt, cir, dim, grp, mk, user1, user2, user3, owner, dtable |
| mirror | Mirror | name, fname, id, sid, have, note, scroll, dmode, d_mk, acc_loc | chan, chpt, cir, dim, grp, mk, note, user1, user2, user3, owner, dtable, mpan, mtilt, fpan, ftilt |
| focus | Focus Point | name, fname, id, sid | use, foc_x, foc_y, foc_z |
| misc | Other | name, fname, id, sid, have, acc_loc | |
| mover | Automated Fixture | name, fname, id, sid, have, lamp, watts, frame, bm_w, bm_t, cd_w, cd_t, abm_w, abm_t, wt, note, scroll, dmode, d_mk, d_adj_x, d_adj_y, d_adj_z | hang, num, color, color2, chan, chpt, cir, dim, gobo, use, grp, mk, note, user1, user2, user3, foc_x, foc_y, foc_z, glr, vbeam, vcd, chans, dtable, mpan, mtilt, fpan, ftilt, vbm_per, adj_x, adj_y, adj_z |
| cmymvr | Color Mixing Automated Fixture | name, fname, id, sid, have, lamp, watts, frame, bm_w, bm_t, cd_w, cd_t, abm_w, abm_t, wt, note, scroll, dmode, mixtype, d_mk, d_adj_x, d_adj_y, d_adj_z | hang, num, color, color2, chan, chpt, cir, dim, gobo, use, grp, mk, note, user1, user2, user3, foc_x, foc_y, foc_z, glr, vbeam, vcd, chans, dtable, mpan, mtilt, fpan, ftilt, vbm_per, adj_x, adj_y, adj_z |
| rgb | Color Mixing Rectangular Beam (obsolete rgb) | name, fname, id, sid, have, lamp, watts, frame, bm_x, bm_y, cd, abm_x, abm_y, wt, note, scroll, dmode, mixtype, d_adj_x, d_adj_y, d_adj_z | hang, num, color, color2, chan, chpt, cir, dim, use, grp, mk, note, user1, user2, user3, userF1, userF2, userF3, foc_x, foc_y, foc_z, glr, dtable, adj_x, adj_y, adj_z |
| rgba | Color Mixing Rectangular Beam (obsolete rgba) | name, fname, id, sid, have, lamp, watts, frame, bm_x, bm_y, cd, abm_x, abm_y, wt, note, scroll, dmode, mixtype, d_adj_x, d_adj_y, d_adj_z | hang, num, color, color2, chan, chpt, cir, dim, use, grp, mk, note, user1, user2, user3, userF1, userF2, userF3, foc_x, foc_y, foc_z, glr, dtable, adj_x, adj_y, adj_z |
| led7 | Color Mixing Rectangular Beam | name, fname, id, sid, have, lamp, watts, frame, bm_x, bm_y, cd, abm_x, abm_y, wt, note, scroll, dmode, mixtype, d_adj_x, d_adj_y, d_adj_z | hang, num, color, color2, chan, chpt, cir, dim, use, grp, mk, note, user1, user2, user3, userF1, userF2, userF3, foc_x, foc_y, foc_z, glr, foc_a, dtable, adj_x, adj_y, adj_z |
| led7s | Color Mixing Striplight | name, fname, id, sid, have, lamp, watts, frame, bm_x, bm_y, cd, abm_x, abm_y, wt, cpf, lpc, dbl, note, scroll, dmode, mixtype, d_adj_x, d_adj_y, d_adj_z | hang, num, color, color2, chan, chpt, cir, dim, use, grp, mk, note, user1, user2, user3, foc_x, foc_y, foc_z, glr, dtable, adj_x, adj_y, adj_z |
| cmers | Color Mixing Leko / ERS | name, fname, id, sid, have, lamp, watts, frame, beam, cd, abm, wt, note, scroll, dmode, mixtype, d_mk, d_adj_x, d_adj_y, d_adj_z | hang, num, color, color2, chan, chpt, cir, dim, gobo, use, grp, mk, note, user1, user2, user3, userF1, userF2, userF3, foc_x, foc_y, foc_z, glr, dtable, adj_x, adj_y, adj_z |
| cmzers | Color Mixing Zoom ERS | name, fname, id, sid, have, lamp, watts, frame, bm_w, bm_t, cd_w, cd_t, abm_w, abm_t, wt, note, scroll, dmode, mixtype, d_mk, d_adj_x, d_adj_y, d_adj_z | hang, num, color, color2, chan, chpt, cir, dim, gobo, use, grp, mk, note, user1, user2, user3, userF1, userF2, userF3, foc_x, foc_y, foc_z, glr, vbeam, vcd, dtable, adj_x, adj_y, adj_z |
| cmscroll | Color Mixing DMX Device | name, fname, id, sid, have, note, scroll, dmode, mixtype, d_mk | chan, chpt, cir, dim, grp, mk, user1, user2, user3, owner, dtable |
| netnode | Network Device | name, fname, id, sid, have, note, dmode | note, user1, user2, user3, ipaddr, mode, univ |
categories
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
<?xml version="1.0" encoding="utf-8"?> <key> <lamps> <properties> #Thu Jan 15 16:34:27 CET 2026 </properties> </lamps> <frames> <properties> #Thu Jan 15 16:34:27 CET 2026 </properties> </frames> <kentry> <kind>misc</kind> <name>toto</name> <custom> <symbol> <id>4b6ca21a-1202-4b37-9121-281572b09a7d</id> <group> <shape> <class>LXGroup</class> <shapes> <shape> <class>LXShape</class> <brectx>144.0</brectx> <brecty>452.0</brecty> <brectw>86.0</brectw> <brecth>135.0</brecth> <rotate>0.0</rotate> <drawSt>y</drawSt> <stWidth>1.0</stWidth> <stColor>0.0,0.0,0.0,1.0</stColor> <drawFl>y</drawFl> <flColor>1.0,1.0,1.0,1.0</flColor> <lnStyle>0</lnStyle> <lock>n</lock> </shape> <shape> <class>LXLineShape</class> <brectx>130.0</brectx> <brecty>550.0</brecty> <brectw>132.0</brectw> <brecth>1.0</brecth> <rotate>0.0</rotate> <drawSt>y</drawSt> <stWidth>1.0</stWidth> <stColor>0.0,0.0,0.0,1.0</stColor> <drawFl>y</drawFl> <flColor>1.0,1.0,1.0,1.0</flColor> <lnStyle>0</lnStyle> <lock>n</lock> <startx>130.0</startx> <starty>550.0</starty> <endx>262.0</endx> <endy>551.0</endy> </shape> </shapes> </shape> </group> </symbol> </custom> </kentry> <filevers>4.2</filevers> </key>
<?xml version="1.0" encoding="utf-8"?> <key> <lamps> <properties> #Tue Apr 30 09:39:12 CEST 2024 </properties> </lamps> <frames> <properties> #Tue Apr 30 09:39:12 CEST 2024 </properties> </frames> <colors> <color_library /> </colors> <gobos> <gobo_library /> </gobos> <kentry> <kind>zers</kind> <wt>17</wt> <watts>750</watts> <note /> <have /> <sid>104</sid> <d_mk /> <lamp>HPL750</lamp> <frame>7.5"</frame> <abm_w>29</abm_w> <abm_t>21</abm_t> <id>s42550</id> <bm_w>46</bm_w> <d_adj_z>-1'-6"</d_adj_z> <bm_t>27</bm_t> <d_adj_y /> <d_adj_x /> <cd_w>63480</cd_w> <cd_t>150745</cd_t> <fname>ETC 42550</fname> <name>25-50° Source Four Zoom</name> </kentry> <kentry> <kind>zers</kind> <name>714sx2</name> <id>rj714sx2</id> <lamp>CP92</lamp> <wt>23.2</wt> <sid>4b6ca21a-1202-4b37-9121-281572b09a7d</sid> <frame>8.46"</frame> <cd>52000</cd> <fname>RJ 714sx2</fname> <watts>2000</watts> <note>2kw = cp92 52000lm / 2500w = cp91 65000lm</note> <abm_w>40</abm_w> <abm_t>40</abm_t> <bm_w>15</bm_w> <bm_t>15</bm_t> <custom> <symbol> <id>4b6ca21a-1202-4b37-9121-281572b09a7d</id> <group> <shape> <class>LXGroup</class> <shapes> <shape> <class>LXPathShape</class> <brectx>0.0</brectx> <brecty>452.0</brecty> <brectw>0.0</brectw> <brecth>0.0</brecth> <rotate>0.0</rotate> <drawSt>y</drawSt> <stWidth>0.5</stWidth> <stColor>0.13725491,0.12156863,0.1254902,1.0</stColor> <drawFl>n</drawFl> <flColor>1.0,1.0,1.0,1.0</flColor> <lnStyle>0</lnStyle> <lock>n</lock> <path> <e> <t>mv</t> <x>353.0544</x> <y>355.66608</y> </e> <e> <t>ln</t> <x>353.0544</x> <y>354.1274</y> </e> <e> <t>ln</t> <x>350.5011</x> <y>354.1274</y> </e> <e> <t>ln</t> <x>350.5011</x> <y>342.61172</y> </e> <e> <t>ln</t> <x>353.0544</x> <y>342.60477</y> </e> <e> <t>ln</t> <x>353.0544</x> <y>354.1274</y> </e> <e> <t>ln</t> <x>353.0544</x> <y>341.08002</y> </e> <e> <t>ln</t> <x>353.0544</x> <y>360.82</y> </e> <e> <t>ln</t> <x>354.91</x> <y>360.82</y> </e> <e> <t>ln</t> <x>354.91</x> <y>348.36194</y> </e> <e> <t>ln</t> <x>368.8275</x> <y>348.36194</y> </e> <e> <t>ln</t> <x>368.83447</x> <y>350.4941</y> </e> <e> <t>ln</t> <x>355.91492</x> <y>350.4941</y> </e> <e> <t>ln</t> <x>355.91492</x> <y>352.20792</y> </e> <e> <t>ln</t> <x>368.8275</x> <y>352.20792</y> </e> <e> <t>ln</t> <x>368.8275</x> <y>353.92865</y> </e> <e> <t>ln</t> <x>355.91492</x> <y>353.92865</y> </e> <e> <t>ln</t> <x>355.91492</x> <y>346.3479</y> </e> <e> <t>ln</t> <x>368.83447</x> <y>346.3479</y> </e> <e> <t>ln</t> <x>368.8275</x> <y>344.45062</y> </e> <e> <t>ln</t> <x>355.91492</x> <y>344.45062</y> </e> <e> <t>ln</t> <x>355.91492</x> <y>353.92865</y> </e> <e> <t>ln</t> <x>355.91492</x> <y>342.7396</y> </e> <e> <t>ln</t> <x>357.57452</x> <y>342.7396</y> </e> <e> <t>ln</t> <x>357.57452</x> <y>353.92865</y> </e> <e> <t>ln</t> <x>359.22717</x> <y>353.92865</y> </e> <e> <t>ln</t> <x>359.22717</x> <y>342.7396</y> </e> <e> <t>ln</t> <x>360.8812</x> <y>342.7396</y> </e> <e> <t>ln</t> <x>360.8812</x> <y>353.92865</y> </e> <e> <t>ln</t> <x>362.49493</x> <y>353.92865</y> </e> <e> <t>ln</t> <x>362.48798</x> <y>342.7396</y> </e> <e> <t>ln</t> <x>364.05722</x> <y>342.7396</y> </e> <e> <t>ln</t> <x>364.05722</x> <y>353.92865</y> </e> <e> <t>ln</t> <x>365.70987</x> <y>353.92865</y> </e> <e> <t>ln</t> <x>365.70987</x> <y>342.7396</y> </e> <e> <t>ln</t> <x>367.31665</x> <y>342.7396</y> </e> <e> <t>ln</t> <x>367.31665</x> <y>353.92865</y> </e> <e> <t>ln</t> <x>355.91492</x> <y>353.92865</y> </e> <e> <t>ln</t> <x>368.8275</x> <y>353.92865</y> </e> <e> <t>ln</t> <x>368.83447</x> <y>352.20792</y> </e> <e> <t>ln</t> <x>368.83447</x> <y>350.4941</y> </e> <e> <t>ln</t> <x>368.83447</x> <y>348.36194</y> </e> <e> <t>ln</t> <x>368.83447</x> <y>346.3479</y> </e> <e> <t>ln</t> <x>368.83447</x> <y>344.45062</y> </e> <e> <t>ln</t> <x>368.83447</x> <y>342.7396</y> </e> <e> <t>ln</t> <x>367.31665</x> <y>342.7396</y> </e> <e> <t>ln</t> <x>365.70987</x> <y>342.7396</y> </e> <e> <t>ln</t> <x>364.05026</x> <y>342.7396</y> </e> <e> <t>ln</t> <x>362.48798</x> <y>342.7396</y> </e> <e> <t>ln</t> <x>360.8812</x> <y>342.7396</y> </e> <e> <t>ln</t> <x>359.22717</x> <y>342.7396</y> </e> <e> <t>ln</t> <x>357.56757</x> <y>342.7396</y> </e> <e> <t>ln</t> <x>355.91492</x> <y>342.7396</y> </e> <e> <t>ln</t> <x>355.91492</x> <y>348.36194</y> </e> <e> <t>ln</t> <x>354.91</x> <y>348.36194</y> </e> <e> <t>ln</t> <x>354.91</x> <y>341.0258</y> </e> <e> <t>ln</t> <x>354.91</x> <y>335.89413</y> </e> <e> <t>ln</t> <x>354.91</x> <y>355.65634</y> </e> <e> <t>ln</t> <x>369.85052</x> <y>355.65634</y> </e> <e> <t>ln</t> <x>354.91</x> <y>355.65634</y> </e> <e> <t>ln</t> <x>354.91</x> <y>360.82</y> </e> <e> <t>ln</t> <x>369.74487</x> <y>360.82</y> </e> <e> <t>ln</t> <x>367.79617</x> <y>360.82</y> </e> <e> <t>ln</t> <x>367.79062</x> <y>362.17657</y> </e> <e> <t>ln</t> <x>369.75183</x> <y>362.17657</y> </e> <e> <t>ln</t> <x>369.75183</x> <y>360.82</y> </e> <e> <t>ln</t> <x>371.7075</x> <y>360.82</y> </e> <e> <t>ln</t> <x>369.85052</x> <y>360.82</y> </e> <e> <t>ln</t> <x>369.85052</x> <y>341.0258</y> </e> <e> <t>ln</t> <x>354.91696</x> <y>341.0258</y> </e> <e> <t>ln</t> <x>354.91</x> <y>335.88858</y> </e> <e> <t>ln</t> <x>369.75183</x> <y>335.88858</y> </e> <e> <t>ln</t> <x>367.79062</x> <y>335.88858</y> </e> <e> <t>ln</t> <x>367.79062</x> <y>335.18246</y> </e> <e> <t>ln</t> <x>363.21075</x> <y>333.24628</y> </e> <e> <t>ln</t> <x>363.21075</x> <y>331.88275</y> </e> <e> <t>ln</t> <x>369.75183</x> <y>333.95236</y> </e> <e> <t>ln</t> <x>369.75183</x> <y>335.88858</y> </e> <e> <t>ln</t> <x>371.7075</x> <y>335.88858</y> </e> <e> <t>ln</t> <x>371.7075</x> <y>360.82</y> </e> <e> <t>ln</t> <x>371.7075</x> <y>358.07626</y> </e> <e> <t>ln</t> <x>373.5311</x> <y>358.0679</y> </e> <e> <t>ln</t> <x>373.55054</x> <y>338.61285</y> </e> <e> <t>ln</t> <x>373.5311</x> <y>363.36636</y> </e> <e> <t>ln</t> <x>373.5311</x> <y>358.0679</y> </e> <e> <t>ln</t> <x>375.4075</x> <y>358.0846</y> </e> <e> <t>ln</t> <x>375.4075</x> <y>360.82</y> </e> <e> <t>ln</t> <x>375.4075</x> <y>335.88858</y> </e> <e> <t>ln</t> <x>377.26447</x> <y>335.88858</y> </e> <e> <t>ln</t> <x>377.26447</x> <y>360.82</y> </e> <e> <t>ln</t> <x>375.4075</x> <y>360.82</y> </e> <e> <t>ln</t> <x>401.34387</x> <y>360.82</y> </e> <e> <t>ln</t> <x>399.46884</x> <y>360.82</y> </e> <e> <t>ln</t> <x>399.46188</x> <y>362.2169</y> </e> <e> <t>ln</t> <x>401.34387</x> <y>362.2169</y> </e> <e> <t>ln</t> <x>401.34387</x> <y>360.82</y> </e> <e> <t>ln</t> <x>406.90784</x> <y>360.82</y> </e> <e> <t>ln</t> <x>406.90784</x> <y>336.87125</y> </e> <e> <t>ln</t> <x>409.32214</x> <y>336.87125</y> </e> <e> <t>ln</t> <x>409.32214</x> <y>359.7984</y> </e> <e> <t>ln</t> <x>406.90784</x> <y>359.7984</y> </e> <e> <t>ln</t> <x>409.32214</x> <y>359.7984</y> </e> <e> <t>ln</t> <x>409.32214</x> <y>336.87125</y> </e> <e> <t>ln</t> <x>406.90784</x> <y>336.87125</y> </e> <e> <t>ln</t> <x>406.90784</x> <y>335.88858</y> </e> <e> <t>ln</t> <x>395.83273</x> <y>335.88858</y> </e> <e> <t>ln</t> <x>395.83273</x> <y>334.1428</y> </e> <e> <t>ln</t> <x>394.0286</x> <y>334.13446</y> </e> <e> <t>ln</t> <x>394.0286</x> <y>335.88858</y> </e> <e> <t>ln</t> <x>395.8397</x> <y>335.88858</y> </e> <e> <t>ln</t> <x>375.4075</x> <y>335.88858</y> </e> <e> <t>ln</t> <x>375.4075</x> <y>338.63928</y> </e> <e> <t>ln</t> <x>373.5311</x> <y>338.63928</y> </e> <e> <t>ln</t> <x>373.5311</x> <y>333.27826</y> </e> <e> <t>ln</t> <x>373.5311</x> <y>338.63928</y> </e> <e> <t>ln</t> <x>371.7075</x> <y>338.63928</y> </e> <e> <t>ln</t> <x>371.7075</x> <y>335.88858</y> </e> <e> <t>ln</t> <x>369.85052</x> <y>335.88858</y> </e> <e> <t>ln</t> <x>369.85052</x> <y>341.0258</y> </e> <e> <t>ln</t> <x>354.91</x> <y>341.0258</y> </e> <e> <t>ln</t> <x>354.91</x> <y>335.88858</y> </e> <e> <t>ln</t> <x>353.0544</x> <y>335.88858</y> </e> <e> <t>ln</t> <x>353.0544</x> <y>341.07446</y> </e> <e> <t>ln</t> <x>349.16953</x> <y>341.07446</y> </e> <e> <t>ln</t> <x>349.16953</x> <y>355.66608</y> </e> <e> <t>ln</t> <x>353.0544</x> <y>355.66608</y> </e> </path> </shape> </shapes> </shape> </group> </symbol> </custom> </kentry> <kentry> <kind>zers</kind> <name>713sx2</name> <id>rj713sx2</id> <lamp>CP92</lamp> <wt>22</wt> <sid>c24bcd83-1a40-4e48-87e2-56dfb7fba6ec</sid> <frame>8.46"</frame> <cd>52000</cd> <fname>RJ 713sx2</fname> <watts>2000</watts> <note>2kw = cp92 52000lm / 2500w = cp91 65000lm</note> <abm_w>50</abm_w><![CDATA[ beam wide ]]> <abm_t>29</abm_t><![CDATA[ beam tight ]]> <bm_w>50</bm_w><![CDATA[ field wide ]]> <bm_t>29</bm_t><![CDATA[ field tight ]]> <custom> <symbol> <id>c24bcd83-1a40-4e48-87e2-56dfb7fba6ec</id> <group> <shape> <class>LXGroup</class> <shapes> <shape> <class>LXPathShape</class> <brectx>0.0</brectx> <brecty>452.0</brecty> <brectw>0.0</brectw> <brecth>0.0</brecth> <rotate>0.0</rotate> <drawSt>y</drawSt> <stWidth>1.0</stWidth> <stColor>0.13725491,0.12156863,0.1254902,1.0</stColor> <drawFl>n</drawFl> <flColor>1.0,1.0,1.0,1.0</flColor> <lnStyle>0</lnStyle> <lock>n</lock> <path> <e> <t>mv</t> <x>352.79733</x> <y>356.30347</y> </e> <e> <t>ln</t> <x>352.79733</x> <y>354.7648</y> </e> <e> <t>ln</t> <x>350.301</x> <y>354.7648</y> </e> <e> <t>ln</t> <x>350.301</x> <y>343.23938</y> </e> <e> <t>ln</t> <x>352.79733</x> <y>343.23105</y> </e> <e> <t>ln</t> <x>352.79733</x> <y>354.7648</y> </e> <e> <t>ln</t> <x>352.79733</x> <y>341.7035</y> </e> <e> <t>ln</t> <x>352.79733</x> <y>361.46573</y> </e> <e> <t>ln</t> <x>354.61398</x> <y>361.46573</y> </e> <e> <t>ln</t> <x>354.61398</x> <y>348.99374</y> </e> <e> <t>ln</t> <x>368.22153</x> <y>348.99374</y> </e> <e> <t>ln</t> <x>368.2299</x> <y>351.12732</y> </e> <e> <t>ln</t> <x>355.59528</x> <y>351.12732</y> </e> <e> <t>ln</t> <x>355.59528</x> <y>352.8439</y> </e> <e> <t>ln</t> <x>368.22153</x> <y>352.8439</y> </e> <e> <t>ln</t> <x>368.22153</x> <y>354.56604</y> </e> <e> <t>ln</t> <x>355.59528</x> <y>354.56604</y> </e> <e> <t>ln</t> <x>355.59528</x> <y>346.97693</y> </e> <e> <t>ln</t> <x>368.2299</x> <y>346.97693</y> </e> <e> <t>ln</t> <x>368.22153</x> <y>345.07965</y> </e> <e> <t>ln</t> <x>355.59528</x> <y>345.07965</y> </e> <e> <t>ln</t> <x>355.59528</x> <y>354.56604</y> </e> <e> <t>ln</t> <x>355.59528</x> <y>343.36307</y> </e> <e> <t>ln</t> <x>357.21735</x> <y>343.36307</y> </e> <e> <t>ln</t> <x>357.21735</x> <y>354.56604</y> </e> <e> <t>ln</t> <x>358.83524</x> <y>354.56604</y> </e> <e> <t>ln</t> <x>358.83524</x> <y>343.36307</y> </e> <e> <t>ln</t> <x>360.45316</x> <y>343.36307</y> </e> <e> <t>ln</t> <x>360.45316</x> <y>354.56604</y> </e> <e> <t>ln</t> <x>362.03073</x> <y>354.56604</y> </e> <e> <t>ln</t> <x>362.02377</x> <y>343.36307</y> </e> <e> <t>ln</t> <x>363.5569</x> <y>343.36307</y> </e> <e> <t>ln</t> <x>363.5569</x> <y>354.56604</y> </e> <e> <t>ln</t> <x>365.17477</x> <y>354.56604</y> </e> <e> <t>ln</t> <x>365.17477</x> <y>343.36307</y> </e> <e> <t>ln</t> <x>366.74683</x> <y>343.36307</y> </e> <e> <t>ln</t> <x>366.74683</x> <y>354.56604</y> </e> <e> <t>ln</t> <x>355.59528</x> <y>354.56604</y> </e> <e> <t>ln</t> <x>368.22153</x> <y>354.56604</y> </e> <e> <t>ln</t> <x>368.2299</x> <y>352.8439</y> </e> <e> <t>ln</t> <x>368.2299</x> <y>351.12732</y> </e> <e> <t>ln</t> <x>368.2299</x> <y>348.99374</y> </e> <e> <t>ln</t> <x>368.2299</x> <y>346.97693</y> </e> <e> <t>ln</t> <x>368.2299</x> <y>345.07965</y> </e> <e> <t>ln</t> <x>368.2299</x> <y>343.36307</y> </e> <e> <t>ln</t> <x>366.74683</x> <y>343.36307</y> </e> <e> <t>ln</t> <x>365.17477</x> <y>343.36307</y> </e> <e> <t>ln</t> <x>363.55133</x> <y>343.36307</y> </e> <e> <t>ln</t> <x>362.02377</x> <y>343.36307</y> </e> <e> <t>ln</t> <x>360.45316</x> <y>343.36307</y> </e> <e> <t>ln</t> <x>358.83524</x> <y>343.36307</y> </e> <e> <t>ln</t> <x>357.2118</x> <y>343.36307</y> </e> <e> <t>ln</t> <x>355.59528</x> <y>343.36307</y> </e> <e> <t>ln</t> <x>355.59528</x> <y>348.99374</y> </e> <e> <t>ln</t> <x>354.61398</x> <y>348.99374</y> </e> <e> <t>ln</t> <x>354.61398</x> <y>341.65067</y> </e> <e> <t>ln</t> <x>354.61398</x> <y>336.51343</y> </e> <e> <t>ln</t> <x>354.61398</x> <y>356.2965</y> </e> <e> <t>ln</t> <x>369.2223</x> <y>356.2965</y> </e> <e> <t>ln</t> <x>354.61398</x> <y>356.2965</y> </e> <e> <t>ln</t> <x>354.61398</x> <y>361.46573</y> </e> <e> <t>ln</t> <x>369.12085</x> <y>361.46573</y> </e> <e> <t>ln</t> <x>367.2152</x> <y>361.46573</y> </e> <e> <t>ln</t> <x>367.20828</x> <y>362.8223</y> </e> <e> <t>ln</t> <x>369.12778</x> <y>362.8223</y> </e> <e> <t>ln</t> <x>369.12778</x> <y>361.46573</y> </e> <e> <t>ln</t> <x>371.03897</x> <y>361.46573</y> </e> <e> <t>ln</t> <x>369.2223</x> <y>361.46573</y> </e> <e> <t>ln</t> <x>369.2223</x> <y>341.65067</y> </e> <e> <t>ln</t> <x>354.62094</x> <y>341.65067</y> </e> <e> <t>ln</t> <x>354.61398</x> <y>336.50647</y> </e> <e> <t>ln</t> <x>369.12778</x> <y>336.50647</y> </e> <e> <t>ln</t> <x>367.20828</x> <y>336.50647</y> </e> <e> <t>ln</t> <x>367.20828</x> <y>335.799</y> </e> <e> <t>ln</t> <x>362.72986</x> <y>333.86142</y> </e> <e> <t>ln</t> <x>362.72986</x> <y>332.4965</y> </e> <e> <t>ln</t> <x>369.12778</x> <y>334.5689</y> </e> <e> <t>ln</t> <x>369.12778</x> <y>336.50647</y> </e> <e> <t>ln</t> <x>371.03897</x> <y>336.50647</y> </e> <e> <t>ln</t> <x>371.03897</x> <y>361.46573</y> </e> <e> <t>ln</t> <x>371.03897</x> <y>358.7178</y> </e> <e> <t>ln</t> <x>372.82227</x> <y>358.70944</y> </e> <e> <t>ln</t> <x>372.8417</x> <y>339.23773</y> </e> <e> <t>ln</t> <x>372.82227</x> <y>364.0121</y> </e> <e> <t>ln</t> <x>372.82227</x> <y>358.70944</y> </e> <e> <t>ln</t> <x>374.6584</x> <y>358.72614</y> </e> <e> <t>ln</t> <x>374.6584</x> <y>361.46573</y> </e> <e> <t>ln</t> <x>374.6584</x> <y>336.50647</y> </e> <e> <t>ln</t> <x>376.47363</x> <y>336.50647</y> </e> <e> <t>ln</t> <x>376.47363</x> <y>361.46573</y> </e> <e> <t>ln</t> <x>374.6584</x> <y>361.46573</y> </e> <e> <t>ln</t> <x>391.29462</x> <y>361.46573</y> </e> <e> <t>ln</t> <x>391.29462</x> <y>337.4586</y> </e> <e> <t>ln</t> <x>393.58664</x> <y>337.4586</y> </e> <e> <t>ln</t> <x>393.58664</x> <y>360.41632</y> </e> <e> <t>ln</t> <x>391.29462</x> <y>360.41632</y> </e> <e> <t>ln</t> <x>393.58664</x> <y>360.41632</y> </e> <e> <t>ln</t> <x>393.58664</x> <y>337.4586</y> </e> <e> <t>ln</t> <x>391.29462</x> <y>337.4586</y> </e> <e> <t>ln</t> <x>391.29462</x> <y>336.50647</y> </e> <e> <t>ln</t> <x>382.645</x> <y>336.50647</y> </e> <e> <t>ln</t> <x>382.645</x> <y>334.74405</y> </e> <e> <t>ln</t> <x>380.74078</x> <y>334.74405</y> </e> <e> <t>ln</t> <x>380.74078</x> <y>336.50647</y> </e> <e> <t>ln</t> <x>382.645</x> <y>336.50647</y> </e> <e> <t>ln</t> <x>374.6584</x> <y>336.50647</y> </e> <e> <t>ln</t> <x>374.6584</x> <y>339.25998</y> </e> <e> <t>ln</t> <x>372.82227</x> <y>339.25998</y> </e> <e> <t>ln</t> <x>372.82227</x> <y>333.89478</y> </e> <e> <t>ln</t> <x>372.82227</x> <y>339.25998</y> </e> <e> <t>ln</t> <x>371.03897</x> <y>339.25998</y> </e> <e> <t>ln</t> <x>371.03897</x> <y>336.50647</y> </e> <e> <t>ln</t> <x>369.2223</x> <y>336.50647</y> </e> <e> <t>ln</t> <x>369.2223</x> <y>341.65067</y> </e> <e> <t>ln</t> <x>354.61398</x> <y>341.65067</y> </e> <e> <t>ln</t> <x>354.61398</x> <y>336.50647</y> </e> <e> <t>ln</t> <x>352.79733</x> <y>336.50647</y> </e> <e> <t>ln</t> <x>352.79733</x> <y>341.69653</y> </e> <e> <t>ln</t> <x>349.0</x> <y>341.69653</y> </e> <e> <t>ln</t> <x>349.0</x> <y>356.30347</y> </e> <e> <t>ln</t> <x>352.79733</x> <y>356.30347</y> </e> </path> </shape> </shapes> </shape> </group> </symbol> </custom> </kentry> <filevers>4.2</filevers> </key>
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
<!DOCTYPE html> <html lang="fr"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Lecteur XML avec XPath</title> <script src="https://cdn.jsdelivr.net/npm/xmldom@0.6.0/xmldom.js"></script> <script src="https://cdn.jsdelivr.net/npm/xpath@0.0.3/xpath.js"></script> <style> body { font-family: Arial, sans-serif; margin: 20px; line-height: 1.6; } textarea { width: 100%; height: 200px; margin: 10px 0; } button { padding: 8px 16px; background-color: #007BFF; color: white; border: none; border-radius: 4px; cursor: pointer; } button:hover { background-color: #0056b3; } </style> </head> <body> <h1>Lxplan lib builder</h1> <div> <details> <summary>Cliquer pour la doc</summary> <p>Pour créer une librairie, il faut : <br /> <ul> <li>Dessiner le symbole dans lxplan</li> <li>Le symbole doit etre sur le premier layer</li> <li>Une fois fini, le symbole doit etre dans un groupe</li> <li>Enregistrer le projet dans un fichier .lxxplot</li> <li>Utiliser ce script en important le fichier lxxplot puis en remplissant les champs obligatoires et les autres si besoin</li> <li>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)</li> </ul> </p> </details> </div> <div> <h2>Charger le fichier lxxplot</h2> <p>Sélectionnez un fichier llxplot sur votre appareil :</p> <input type="file" id="fileInput" accept=".lxxplot" onclick="resetResults()" /> </div> <div> <h2>Tests</h2> <div>Le fichier est il un lxxplot ? : <span id="isLxxplot">Sans avis</span></div> <div>Le fichier possede t il une shape sur le premier layer ? :<span id="hasShape">Sans avis</span></div> <div>La shape, commence t elle par un groupe ? :<span id="hasGroup">Sans avis</span></div> <button onclick="loadFile()">Tester le fichier</button> </div> <div id="data_fields"> <h2>Données</h2> <div class="form-section"> <select id="dataType"> <option value="">Sélectionnez un type d'appareil</option> </select> <div id="mandatoryFields"> <div> <label for="name">Type</label> <input type="text" id="name" name="name" required /> </div> <div><label for="fname">Full Name</label> <input type="text" id="fname" name="fname" required /> </div> <div><label for="id">Id</label> <input type="text" id="id" name="id" required /> </div> </div> <details> <summary> Cliquer pour editer les champs optionnels </summary> <div id="dynamicFields"></div> </details> <button id="saveButton" onclick="buildOutput()">Sauvegarder</button> </div> </div> <script> // Charger le fichier XML sélectionné var xmlInputContent = ""; var xmlOutputContent = ""; var shape = ""; var isLxxplot = false; var hasShape = false; var hasGroup = false; var isLxxplotDiv = document.getElementById("isLxxplot"); var hasShapeDiv = document.getElementById("hasShape"); var hasGroupDiv = document.getElementById("hasGroup"); var dataTypeSelect = document.getElementById('dataType'); var dynamicFields = document.getElementById('dynamicFields'); document.addEventListener('DOMContentLoaded', () => { fillSelectOptions(); }); // Tableau des options de la liste de sélection const selectOptions = [ { id: "ers;eko", label: "ERS", fields: "sid;have;lamp;watts;frame;beam;cd;abm;wt;note;d_mk;d_adj_x;d_adj_y;d_adj_z" }, { id: "zers;Zoom Leko", label: "Zoom Leko / ERS", fields: "sid;have;lamp;watts;frame;bm_w;bm_t;cd_w;cd_t;abm_w;abm_t;wt;note;d_mk;d_adj_x;d_adj_y;d_adj_z" }, { id: "fres;Fresnel", label: "Fresnel / PC", fields: "sid;have;lamp;watts;frame;bm_w;bm_t;cd_w;cd_t;abm_w;abm_t;wt;note;d_mk;d_adj_x;d_adj_y;d_adj_z" }, { id: "par", label: "PAR", fields: "sid;have;lamp;watts;frame;bm_x;bm_y;cd;abm_x;abm_y;wt;note;d_mk;d_adj_x;d_adj_y;d_adj_z" }, { id: "fl", label: "Flood", fields: "sid;have;lamp;watts;frame;beam;cd;abm;wt;note;d_mk;d_adj_x;d_adj_y;d_adj_z" }, { id: "strip", label: "Striplight", fields: "sid;have;lamp;watts;frame;bm_x;bm_y;cd;abm_x;abm_y;wt;cpf;lpc;dbl;note;d_mk;d_adj_x;d_adj_y;d_adj_z" }, { id: "scroll", label: "DMX Device", fields: "sid;have;note;scroll;dmode;d_mk;acc_loc" }, { id: "mirror", label: "Mirror", fields: "sid;have;note;scroll;dmode;d_mk;acc_loc" }, { id: "focus", label: "Focus Point", fields: "sid" }, { id: "misc", label: "Other", fields: "sid;have;acc_loc" }, { id: "mover", label: "Automated Fixture", fields: "sid;have;lamp;watts;frame;bm_w;bm_t;cd_w;cd_t;abm_w;abm_t;wt;note;scroll;dmode;d_mk;d_adj_x;d_adj_y;d_adj_z" }, { id: "cmymvr", label: "Color Mixing Automated Fixture", fields: "sid;have;lamp;watts;frame;bm_w;bm_t;cd_w;cd_t;abm_w;abm_t;wt;note;scroll;dmode;mixtype;d_mk;d_adj_x;d_adj_y;d_adj_z" }, { id: "rgb", label: "Color Mixing Rectangular Beam (obsolete rgb)", fields: "sid;have;lamp;watts;frame;bm_x;bm_y;cd;abm_x;abm_y;wt;note;scroll;dmode;mixtype;d_adj_x;d_adj_y;d_adj_z" }, { id: "rgba", label: "Color Mixing Rectangular Beam (obsolete rgba)", fields: "sid;have;lamp;watts;frame;bm_x;bm_y;cd;abm_x;abm_y;wt;note;scroll;dmode;mixtype;d_adj_x;d_adj_y;d_adj_z" }, { id: "led7", label: "Color Mixing Rectangular Beam", fields: "sid;have;lamp;watts;frame;bm_x;bm_y;cd;abm_x;abm_y;wt;note;scroll;dmode;mixtype;d_adj_x;d_adj_y;d_adj_z" }, { id: "led7s", label: "Color Mixing Striplight", fields: "sid;have;lamp;watts;frame;bm_x;bm_y;cd;abm_x;abm_y;wt;cpf;lpc;dbl;note;scroll;dmode;mixtype;d_adj_x;d_adj_y;d_adj_z" }, { id: "cmers;Color Mixing Leko", label: "Color Mixing Leko / ERS", fields: "sid;have;lamp;watts;frame;beam;cd;abm;wt;note;scroll;dmode;mixtype;d_mk;d_adj_x;d_adj_y;d_adj_z" }, { id: "cmzers;Color Mixing Zoom ERS", label: "Color Mixing Zoom ERS", fields: "sid;have;lamp;watts;frame;bm_w;bm_t;cd_w;cd_t;abm_w;abm_t;wt;note;scroll;dmode;mixtype;d_mk;d_adj_x;d_adj_y;d_adj_z" }, { id: "cmscroll", label: "Color Mixing DMX Device", fields: "sid;have;note;scroll;dmode;mixtype;d_mk" }, { id: "netnode", label: "Network Device", fields: "sid;have;note;dmode" }, ]; // Tableau des champs disponibles const availableFields = [ { id: "name", label: "Type", type: "text" }, { id: "fname", label: "Full Name", type: "text" }, { id: "id", label: "ID", type: "text" }, { id: "sid", label: "Symbol ID", type: "text" }, { id: "have", label: "Inventory", type: "number" }, { id: "balance", label: "Balance", type: "number" }, { id: "lamp", label: "Lamp", type: "text" }, { id: "watts", label: "Watts", type: "number" }, { id: "frame", label: "Color Frame", type: "text" }, { id: "beam", label: "Field Angle", type: "number" }, { id: "bm_x", label: "Field X", type: "number" }, { id: "bm_y", label: "Field Y", type: "number" }, { id: "bm_w", label: "Field Wide", type: "number" }, { id: "bm_t", label: "Field Tight", type: "number" }, { id: "cd", label: "Candela", type: "number" }, { id: "cd_w", label: "Candela Wide", type: "number" }, { id: "cd_t", label: "Candela Tight", type: "number" }, { id: "abm", label: "Beam Angle", type: "number" }, { id: "abm_x", label: "Beam X", type: "number" }, { id: "abm_y", label: "Beam Y", type: "number" }, { id: "abm_w", label: "Beam Wide", type: "number" }, { id: "abm_t", label: "Beam Tight", type: "number" }, { id: "wt", label: "Weight", type: "number" }, { id: "cpf", label: "Sections Per Fixture", type: "number" }, { id: "lpc", label: "Lamps Per Circuit", type: "number" }, { id: "dbl", label: "Distance Between Lamps", type: "number" }, { id: "note", label: "More Info", type: "text" }, { id: "scroll", label: "Device Params", type: "text" }, { id: "dmode", label: "Mode", type: "text" }, { id: "mixtype", label: "Mix Type", type: "text" }, { id: "d_mk", label: "Default Mark", type: "text" }, { id: "acc_loc", label: "Placement", type: "text" }, { id: "d_adj_x", label: "Default X Offset", type: "number" }, { id: "d_adj_y", label: "Default Y Offset", type: "number" }, { id: "d_adj_z", label: "Default Z Offset", type: "number" }, ]; function loadFile() { const fileInput = document.getElementById('fileInput'); const file = fileInput.files[0]; if (!file) { alert("Veuillez sélectionner un fichier lxxplot."); return; } const reader = new FileReader(); reader.onload = function (e) { xmlInputContent = e.target.result; runChecks(); /*if (runChecks()) { buildOutput(); }*/ }; reader.readAsText(file); } function resetResults() { isLxxplotDiv.textContent = "Sans avis"; hasShapeDiv.textContent = "Sans avis"; hasGroupDiv.textContent = "Sans avis"; } function runChecks() { isLxxplot = checkIfValidPath("/lxplot", 'isLxxplot'); hasShape = checkIfValidPath("/lxplot/layers/layer/shape", 'hasShape'); hasGroup = checkIfValidPath("/lxplot/layers/layer/shape/class[text() = 'LXGroup']", 'hasGroup'); return (isLxxplot && hasShape && hasGroup); } function buildOutput() { console.log("todo"); buildXmlOutput(); //generateTextFile(xmlInputContent); } function buildXmlOutput() { // 1. Create a new XML document const xml = new DOMParser().parseFromString('<key></key>', 'application/xml'); const root = xml.documentElement; // 2. Create and append elements const kentryElement = xml.createElement('kentry'); const kindElement = xml.createElement("kind"); kindElement.textContent = "ers"; const nameElement = xml.createElement("name"); const fnameElement = xml.createElement("fname"); const idElement = xml.createElement("id"); const customElement = xml.createElement("custom"); const symbolElement = xml.createElement("symbol"); const groupElement = xml.createElement("group"); const shapeElement = xml.createElement("shape"); shapeElement.textContent = shape; groupElement.appendChild(shapeElement); symbolElement.appendChild(groupElement); customElement.appendChild(symbolElement); kentryElement.appendChild(kindElement); kentryElement.appendChild(nameElement); kentryElement.appendChild(fnameElement); kentryElement.appendChild(idElement); kentryElement.appendChild(symbolElement); root.appendChild(kentryElement); // 3. Serialize to string const xmlString = new XMLSerializer().serializeToString(xml); // 4. Create a Blob and URL for download const blob = new Blob([xmlString], { type: 'application/xml' }); const url = URL.createObjectURL(blob); // 5. Trigger download const a = document.createElement('a'); a.href = url; a.download = 'users.xml'; a.click(); // Clean up URL.revokeObjectURL(url); } function checkIfValidPath(xpathQuery, resultDiv) { resultDiv = document.getElementById(resultDiv); resultDiv.textContent = parseXml(xpathQuery).status ? "oui": "non"; console.log(xpathQuery, parseXml(xpathQuery).data); shape = parseXml("/lxplot/layers/layer/shape").data; } function parseXml(xpathQuery) { try { // Parser le XML const parser = new DOMParser(); const xmlDoc = parser.parseFromString(xmlInputContent, "text/xml"); // Exécuter la requête XPath const xpathResult = document.evaluate( xpathQuery, xmlDoc, null, XPathResult.ANY_TYPE, null ); let result = []; let node = xpathResult.iterateNext(); while (node) { result.push(node.textContent); node = xpathResult.iterateNext(); } // Afficher le résultat if (result.length > 0) { return {"status":true, "data": result}; } else { return {"status":false, "data": "Not found"}; } } catch (e) { //resultDiv.textContent = "Erreur : " + e.message; console.error("error parsing xml",e.message); return {"status":false, "data": "Error"+ e.message}; } } function generateTextFile(content, filename = "my_lib.lxkey") { /*const blob = new Blob([content], { type: "text/xml;charset=utf-8" }); const link = document.createElement("a"); link.href = URL.createObjectURL(blob); link.download = filename; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(link.href);*/ const blob = new Blob([content], { type: 'application/xml;charset=utf-8' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'my_lib.lxkey'; a.click(); URL.revokeObjectURL(url); } // Remplit la liste déroulante avec les options function fillSelectOptions() { //const dataTypeSelect = document.getElementById("dataType"); dataTypeSelect.innerHTML = '<option value="">Sélectionnez un type d\'appareil</option>'; selectOptions.forEach((option) => { const optElement = document.createElement("option"); optElement.value = option.id; optElement.textContent = option.label; dataTypeSelect.appendChild(optElement); }); } dataTypeSelect.addEventListener("change", () => { const selectedOptionId = dataTypeSelect.value; displayDynamicFields(selectedOptionId); }); // Affiche les champs dynamiques en fonction de l'option sélectionnée function displayDynamicFields(selectedOptionId) { dynamicFields.innerHTML = "";// Efface les champs précédents // Trouve l'option sélectionnée const selectedOption = selectOptions.find((option) => option.id === selectedOptionId); if (!selectedOption || !selectedOption.fields) return; // Récupère les IDs des champs à afficher const fieldIds = selectedOption.fields.split(";"); // Affiche chaque champ fieldIds.forEach((fieldId) => { const field = availableFields.find((f) => f.id === fieldId); if (field) { const fieldDiv = document.createElement("div"); fieldDiv.innerHTML = ` <label for="${field.id}">${field.label}:</label> <input type="${field.type}" id="${field.id}" name="${field.id}" /> `; dynamicFields.appendChild(fieldDiv); } }); } </script> </body> </html>