User Tools

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
lxplan [2026/01/16 14:06] ssm2017lxplan [2026/01/27 12:47] (current) – [js version] ssm2017
Line 3: Line 3:
 ==== fields ==== ==== fields ====
 === graphic fields === === graphic fields ===
-<sxh> +^ Key ^ Human Key ^ 
-loc_x Location X +loc_x Location X | 
-loc_y Location Y +loc_y Location Y | 
-loc_z Location Z +loc_z Location Z | 
-size_w Width +size_w Width | 
-size_h Height +size_h Height | 
-start_x Start X +start_x Start X | 
-start_y Start Y +start_y Start Y | 
-end_x End X +end_x End X | 
-end_y End Y +end_y End Y | 
-len Length +len Length | 
-dir Direction +dir Direction | 
-ctl1_x Control One X +ctl1_x Control One X | 
-ctl1_y Control One Y +ctl1_y Control One Y | 
-ctl2_x Control Two X +ctl2_x Control Two X | 
-ctl2_y Control Two Y +ctl2_y Control Two Y | 
-scale_w Width  % +scale_w Width  % | 
-scale_h Height % +scale_h Height % | 
-draw_fl Draw Fill +draw_fl Draw Fill | 
-dr_st Draw Stroke +dr_st Draw Stroke | 
-fl_color Fill Color +fl_color Fill Color | 
-st_color Stroke Color +st_color Stroke Color | 
-st_w Stroke Width +st_w Stroke Width | 
-ln_style Line Style +ln_style Line Style | 
-ch_font Change Font +ch_font Change Font | 
-font Font +font Font | 
-rotate Rotation +rotate Rotation | 
-id Key ID +id Key ID | 
-loc_l Left +loc_l Left | 
-loc_r Right +loc_r Right | 
-loc_t Top +loc_t Top | 
-loc_b Bottom +loc_b Bottom | 
-start_z Start Z +start_z Start Z | 
-end_z End Z +end_z End Z | 
-n_sides Sides +n_sides Sides | 
-crop_l Crop Left +crop_l Crop Left | 
-crop_r Crop Right +crop_r Crop Right | 
-crop_t Crop Top +crop_t Crop Top | 
-crop_b Crop Bottom +crop_b Crop Bottom | 
-3dtype Type +3dtype Type |
-</sxh>+
 === report fields === === report fields ===
-<sxh> +^ Key ^ Human Key ^ 
-space Space +space Space | 
-color+frame Color/Frame +color+frame Color/Frame | 
-color+type Color/Type +color+type Color/Type | 
-pdist Location +pdist Location | 
-foc_pt Focus Pt. +foc_pt Focus Pt. | 
-bnc_pt Bounce Pt. +bnc_pt Bounce Pt. | 
-INPUT Input +INPUT Input | 
-sheets Sheets +sheets Sheets | 
-full_cname Full Color Name +full_cname Full Color Name | 
-patch Patch +patch Patch | 
-uuid UUID +uuid UUID | 
-keep Keep +keep Keep |
-</sxh>+
 === key fields === === key fields ===
-<sxh> +^ Key ^ Human Key ^ RPT ^ 
-name Type +name Type | | 
-fname Full Name +fname Full Name | | 
-id ID +id ID | n | 
-sid Symbol ID +sid Symbol ID | | 
-have Inventory +have Inventory | | 
-balance Balance +balance Balance | | 
-lamp Lamp +lamp Lamp | | 
-watts Watts +watts Watts | | 
-frame Color Frame +frame Color Frame | | 
-beam Field Angle +beam Field Angle | n | 
-bm_x Field X +bm_x Field X | n | 
-bm_y Field Y +bm_y Field Y | n | 
-bm_w Field Wide +bm_w Field Wide | n | 
-bm_t Field Tight +bm_t Field Tight | n | 
-cd Candela +cd Candela | n | 
-cd_w Candela Wide +cd_w Candela Wide | n | 
-cd_t Candela Tight +cd_t Candela Tight | n | 
-abm Beam Angle +abm Beam Angle | n | 
-abm_x Beam X +abm_x Beam X | n | 
-abm_y Beam Y +abm_y Beam Y | n | 
-abm_w Beam Wide +abm_w Beam Wide | n | 
-abm_t Beam Tight +abm_t Beam Tight | n | 
-wt Weight +wt Weight | | 
-cpf Sections Per Fixture +cpf Sections Per Fixture | n | 
-lpc Lamps Per Circuit +lpc Lamps Per Circuit | n | 
-dbl Distance Between Lamps +dbl Distance Between Lamps | n | 
-note More Info +note More Info | | 
-scroll Device Params +scroll Device Params | n | 
-dmode Mode +dmode Mode | n | 
-mixtype Mix Type +mixtype Mix Type | n | 
-d_mk Default Mark +d_mk Default Mark | n | 
-acc_loc Placement +acc_loc Placement | n | 
-d_adj_x Default X Offset +d_adj_x Default X Offset | n | 
-d_adj_y Default Y Offset +d_adj_y Default Y Offset | n | 
-d_adj_z Default Z Offset +d_adj_z Default Z Offset | n |
-</sxh>+
 === kinds === === kinds ===
-<sxh> +^ Key ^ Human Key ^ Keyfields ^ Infofields ^ 
-ers Leko / ERS +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 +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 +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 +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 +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 +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 +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 +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 +focus Focus Point | name, fname, id, sid | use, foc_x, foc_y, foc_z | 
-misc Other +misc Other | name, fname, id, sid, have, acc_loc | | 
-mover Automated Fixture +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 +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) +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) +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 +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 +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 +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 +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 +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 +netnode Network Device | name, fname, id, sid, have, note, dmode | note, user1, user2, user3, ipaddr, mode, univ |
-</sxh>+
 === categories === === categories ===
-<sxh>+<code>
 Hide Hide
 Position Position
Line 129: Line 125:
 Device Device
 3D 3D
-</sxh>+</code>
 === sub indices === === sub indices ===
-<sxh> +^ Key ^ Human Key ^ Subindex ^ Abbr ^ GDTF ^ 
-shutter Shutter 101 sht Shutter1 +shutter Shutter 101 sht Shutter1 | 
-strobe Strobe 102 St StrobeRate,Strobe1 +strobe Strobe 102 St StrobeRate,Strobe1 | 
-wh1 Gobo Wheel 130 gW Gobo1 +wh1 Gobo Wheel 130 gW Gobo1 | 
-wh1rot Gobo Rotation 131 gWr Gobo1PosRotate +wh1rot Gobo Rotation 131 gWr Gobo1PosRotate | 
-wh1fun Gobo Function 132 gWf +wh1fun Gobo Function 132 gWf | | 
-wh2rot Gobo 2 Rotation 134 gW2r Gobo2PosRotate +wh2rot Gobo 2 Rotation 134 gW2r Gobo2PosRotate | 
-wh2fun Gobo 2 Function 135 gW2f +wh2fun Gobo 2 Function 135 gW2f | | 
-shut1a Shutter 1 151 sh1 Blade1A +shut1a Shutter 1 151 sh1 Blade1A | 
-shut1b Shutter 1b 152 sh1b Blade1B,Blade1Rot +shut1b Shutter 1b 152 sh1b Blade1B,Blade1Rot | 
-shut2a Shutter 2 153 sh2 Blade2A +shut2a Shutter 2 153 sh2 Blade2A | 
-shut2b Shutter 2b 154 sh2b Blade2B,Blade2Rot +shut2b Shutter 2b 154 sh2b Blade2B,Blade2Rot | 
-shut3a Shutter 3 155 sh3 Blade3A +shut3a Shutter 3 155 sh3 Blade3A | 
-shut3b Shutter 3b 156 sh3b Blade3B,Blade3Rot +shut3b Shutter 3b 156 sh3b Blade3B,Blade3Rot | 
-shut4a Shutter 4 157 sh4 Blade4A +shut4a Shutter 4 157 sh4 Blade4A | 
-shut4b Shutter 4b 158 sh4b Blade4B,Blade4Rot +shut4b Shutter 4b 158 sh4b Blade4B,Blade4Rot | 
-shutrot Shutter Rotation 160 shr ShaperRot +shutrot Shutter Rotation 160 shr ShaperRot | 
-spd_c Color Speed 171 clrspd ColorMixMSpeed +spd_c Color Speed 171 clrspd ColorMixMSpeed | 
-spd_pt Pan/Tilt Speed 172 p/tspd PositionMSpeed +spd_pt Pan/Tilt Speed 172 p/tspd PositionMSpeed | 
-spd_b Beam Speed 174 bmspd IrisMSpeed,ZoomMSpeed +spd_b Beam Speed 174 bmspd IrisMSpeed,ZoomMSpeed | 
-spd_e Edge Speed 175 edgspd FocusMSpeed +spd_e Edge Speed 175 edgspd FocusMSpeed | 
-spd_fn Fan Speed 177 fnspd +spd_fn Fan Speed 177 fnspd | | 
-fx FX 180 FX +fx FX 180 FX | | 
-fx1rot Wheel 1 Rotation 183 wh1r +fx1rot Wheel 1 Rotation 183 wh1r | | 
-prism Prism 189 pri Prism1 +prism Prism 189 pri Prism1 | 
-cntl Control 190 cntl Control1 +cntl Control 190 cntl Control1 | 
-mac Macros 191 mac +mac Macros 191 mac | | 
-mac_c Color Macros 192 Cmac ColorMacro1 +mac_c Color Macros 192 Cmac ColorMacro1 | 
-reset Reset 199 Rst FixtureCalibrationReset +reset Reset 199 Rst FixtureCalibrationReset | 
-Mode Mode 200 mode Mode +Mode Mode 200 mode Mode |
-</sxh>+
 === lt info fields === === lt info fields ===
-<sxh> +^ Key ^ Human Key ^ Inner ^ Single ^ Numeric ^ Angle ^ Dist ^ Category ^ Subindex ^ Abbr ^ GDTF ^ Control ^ Font Name ^ Font Size ^ RPT ^ 
-hang Position 0.0 0.0 +hang Position | | | | 0.0 0.0 | | | | | Helvetica | 10 | | 
-num 0.0 0.0 +num | | 0.0 0.0 | | | | | Helvetica | 6 | | 
-color Color ; 2 ; frame ; Color1 ; y ; 0.0 7.0 +color Color | | | | 0.0 7.0 | 2 | frame | Color1 | y | Times-Italic | 9 | | 
-color2 Frost ; 9 ; Frost1 ; y ; 0.0 14.0 +color2 Frost | | | | 0.0 14.0 | 9 | | Frost1 | y | Times-Roman | 9 | | 
-chan Channel 180.0 8.0 +chan Channel | | | 180.0 8.0 | | | | | Helvetica-Bold | 9 | | 
-chpt Channel Part 0.0 0.0 +chpt Channel Part | | | 0.0 0.0 | | | | | Helvetica | 12 | | 
-cir Circuit 180.0 20.0 +cir Circuit | | | 180.0 20.0 | | | | | Helvetica | 10 | | 
-dim Address 180.0 20.0 +dim Address | | | 180.0 20.0 | | | | | Helvetica | 10 | | 
-gobo Template ; 10 ; gobo ; Gobo1 ; y ; 0.0 20.0 +gobo Template | | | | 0.0 20.0 | 10 | gobo | Gobo1 | y | Helvetica | 10 | | 
-use Use 0.0 20.0 +use Use | | | | 0.0 20.0 | | | | | Helvetica | 10 | | 
-grp Group 0.0 0.0 +grp Group | | | | 0.0 0.0 | | | | | Helvetica | 10 | | 
-mk Mark 0.0 6.0 +mk Mark | | | 0.0 6.0 | | | | | Helvetica | 6 | | 
-note Note 0.0 0.0 +note Note | | | | 0.0 0.0 | | | | | Helvetica | 10 | | 
-user1 User Data 0.0 0.0 +user1 User Data | | | | 0.0 0.0 | | | | | Helvetica | 12 | | 
-user2 User Data 2 0.0 0.0 +user2 User Data 2 | | | | 0.0 0.0 | | | | | Helvetica | 12 | | 
-user3 User Data 3 0.0 0.0 +user3 User Data 3 | | | | 0.0 0.0 | | | | | Helvetica | 12 | | 
-userF1 Focus Center 0.0 0.0 +userF1 Focus Center | | | | 0.0 0.0 | | | | | Helvetica | 12 | | 
-userF2 Focus Beam 0.0 0.0 +userF2 Focus Beam | | | | 0.0 0.0 | | | | | Helvetica | 12 | | 
-userF3 Focus Cuts 0.0 0.0 +userF3 Focus Cuts | | | | 0.0 0.0 | | | | | Helvetica | 12 | | 
-foc_x Focus X 0.0 0.0 +foc_x Focus X | | | | 0.0 0.0 | | | | | Helvetica | 10 | | 
-foc_y Focus Y 0.0 0.0 +foc_y Focus Y | | | | 0.0 0.0 | | | | | Helvetica | 10 | | 
-foc_z Focus Height 0.0 0.0 +foc_z Focus Height | | | | 0.0 0.0 | | | | | Helvetica | 10 | n | 
-glr Rendering 0.0 0.0 +glr Rendering | | | | 0.0 0.0 | | | | | Helvetica | 12 | n | 
-edge Edge ; 13 ; edge ; Focus1 ; y ; 0.0 0.0 +edge Edge | | | | 0.0 0.0 | 13 | edge | Focus1 | y | Helvetica | 12 | n | 
-vbeam Spot/Flood ; 8 ; zoom ; Zoom ; y ; 0.0 0.0 +vbeam Spot/Flood | | | | 0.0 0.0 | 8 | zoom | Zoom | y | Helvetica | 10 | n | 
-vcd Cd@Spot/Flood ; 11 ; vCd ; y ; 0.0 0.0 +vcd Cd@Spot/Flood | | | | 0.0 0.0 | 11 | vCd | | y | Helvetica | 10 | n | 
-foc_a Beam Axis ; 12 ; Bma ; ShaperRot ; y ; 0.0 0.0 +foc_a Beam Axis | | | | 0.0 0.0 | 12 | Bma | ShaperRot | y | Helvetica | 10 | | 
-chans Channels 0.0 0.0 +chans Channels | | | | 0.0 0.0 | | | | | Helvetica | 12 | | 
-owner Owner ID 0.0 0.0 +owner Owner ID | | | | 0.0 0.0 | | | | | Helvetica | 10 | | 
-dtable Parameters 0.0 0.0 +dtable Parameters | | | | 0.0 0.0 | | | | | Helvetica | 12 | | 
-mpan Pan pan Pan 0.0 0.0 5 +mpan Pan | | | | 0.0 | 0.0 | 5 | pan Pan | Helvetica | 12 | n | 
-mtilt ; Tilt ; tilt Tilt 0.0 0.0 5 +| mtilt | Tilt | | | | 0.0 0.0 tilt Tilt | Helvetica | 12 | n | 
-vbm_per ; Iris% ; iris Iris ; y ; 0.0 0.0 5 +| vbm_per | Iris% | | y | | 0.0 0.0 iris Iris | Helvetica | 12 | n | 
-intensity ; Intensity ; int% Dimmer 0.0 0.0 5 +| intensity | Intensity | | | | 0.0 0.0 int% Dimmer | Helvetica | 12 | n | 
-mixHue ; Hue ; 19 hue HSB_Hue 0.0 0.0 5 +| mixHue | Hue | | | | 0.0 0.0 19 hue HSB_Hue | Helvetica | 12 | n | 
-mixSat ; Saturation ; 20 sat. HSB_Saturation 0.0 0.0 5 +| mixSat | Saturation | | | | 0.0 0.0 20 sat. HSB_Saturation | Helvetica | 12 | n | 
-mixCy ; Cyan ; 21 Cy ColorSub_C,ColorAdd_C,ColorRGB_Cyan 0.0 0.0 5 +| mixCy | Cyan | | | | 0.0 0.0 21 Cy ColorSub_C,ColorAdd_C,ColorRGB_Cyan | Helvetica | 12 | n | 
-mixCIEx ; Color X ; 17 cX CIE_X 0.0 0.0 5 +| mixCIEx | Color X | | | | 0.0 0.0 17 cX CIE_X | Helvetica | 12 | n | 
-mixCIEy ; Color Y ; 18 cY CIE_Y 0.0 0.0 5 +| mixCIEy | Color Y | | | | 0.0 0.0 18 cY CIE_Y | Helvetica | 12 | n | 
-mixMg ; Magenta ; 22 Mg ColorSub_M,ColorAdd_M,ColorRGB_Magenta 0.0 0.0 5 +| mixMg | Magenta | | | | 0.0 0.0 22 Mg ColorSub_M,ColorAdd_M,ColorRGB_Magenta | Helvetica | 12 | n | 
-mixYl ; Yellow ; 23 Yl ColorSub_Y,ColorAdd_Y,ColorRGB_Yellow 0.0 0.0 5 +| mixYl | Yellow | | | | 0.0 0.0 23 Yl ColorSub_Y,ColorAdd_Y,ColorRGB_Yellow | Helvetica | 12 | n | 
-mixRd ; Red ; 24 Rd ColorAdd_R,ColorRGB_Red 0.0 0.0 5 +| mixRd | Red | | | | 0.0 0.0 24 Rd ColorAdd_R,ColorRGB_Red | Helvetica | 12 | n | 
-mixGn ; Green ; 25 Gn ColorAdd_G,ColorRGB_Green 0.0 0.0 5 +| mixGn | Green | | | | 0.0 0.0 25 Gn ColorAdd_G,ColorRGB_Green | Helvetica | 12 | n | 
-mixBl ; Blue ; 26 Bl ColorAdd_B,ColorRGB_Blue 0.0 0.0 5 +| mixBl | Blue | | | | 0.0 0.0 26 Bl ColorAdd_B,ColorRGB_Blue | Helvetica | 12 | n | 
-mixRo ; Red-Orange ; 27 Ro 0.0 0.0 5 +| mixRo | Red-Orange | | | | 0.0 0.0 27 Ro | | | Helvetica | 12 | n | 
-mixAm ; Amber ; 28 Am ColorAdd_RY,ColorAdd_A 0.0 0.0 5 +| mixAm | Amber | | | | 0.0 0.0 28 Am ColorAdd_RY,ColorAdd_A | Helvetica | 12 | n | 
-mixIn ; Indigo ; 29 Ig ColorAdd_BM 0.0 0.0 5 +| mixIn | Indigo | | | | 0.0 0.0 29 Ig ColorAdd_BM | Helvetica | 12 | n | 
-mixWh ; White ; 30 Wh ColorAdd_W 0.0 0.0 5 +| mixWh | White | | | | 0.0 0.0 30 Wh ColorAdd_W | Helvetica | 12 | n | 
-mixWW ; Warm White ; 31 wW ColorAdd_WW 0.0 0.0 5 +| mixWW | Warm White | | | | 0.0 0.0 31 wW ColorAdd_WW | Helvetica | 12 | n | 
-mixCW ; Cool White ; 32 cW ColorAdd_CW 0.0 0.0 5 +| mixCW | Cool White | | | | 0.0 0.0 32 cW ColorAdd_CW | Helvetica | 12 | n | 
-mixLm ; Lime ; 33 Lm ColorAdd_GY,ColorAdd_L 0.0 0.0 5 +| mixLm | Lime | | | | 0.0 0.0 33 Lm ColorAdd_GY,ColorAdd_L | Helvetica | 12 | n | 
-mixUV ; UV ; 34 uv ColorAdd_UV ; 0.0 ; 0.0 ; 5 +| mixUV | UV | | | | 0.0 0.0 34 uv ColorAdd_UV | Helvetica | 12 | n | 
-adj_x X offset 0.0 0.0 +adj_x X offset | | | | 0.0 0.0 | | | | | Helvetica | 12 | n | 
-adj_y Y offset 0.0 0.0 +adj_y Y offset | | | | 0.0 0.0 | | | | | Helvetica | 12 | n | 
-adj_z Z offset 0.0 0.0 +adj_z Z offset | | | | 0.0 0.0 | | | | | Helvetica | 12 | n | 
-ipaddr IP Address 0.0 9.0 +ipaddr IP Address | | | | 0.0 9.0 | | | | | CourierNewPSMT | 12 | | 
-mode Mode 0.0 0.0 +mode Mode | | | | 0.0 0.0 | | | | | ArialNarrow | 12 | | 
-univ Universe 180.0 7.0 5 +univ Universe | | | 180.0 7.0 | | | | | Arial-Black | 12 | |
-</sxh>+
 === pos info fields === === pos info fields ===
-<sxh> +^ Key ^ Human Key ^ Inner ^ Single ^ Angle ^ Dist ^ Category ^ Font Name ^ Font Size ^ 
-pname Name 0.0 10.0 +pname Name | | 0.0 10.0 | Helvetica-BoldOblique | 12 | 
-ht Height 0.0 0.0 +ht Height | | 0.0 0.0 | Helvetica | 10 | 
-n_o Numbering 0.0 0.0 +n_o Numbering | | 0.0 0.0 | Helvetica | 10 | 
-l_o Layout 0.0 0.0 +l_o Layout | | 0.0 0.0 | Helvetica-BoldOblique | 12 | 
-space Spacing 0.0 0.0 +space Spacing | | 0.0 0.0 | Helvetica | 12 | 
-l_off Offset Layout 0.0 0.0 +l_off Offset Layout | | 0.0 0.0 | Helvetica | 12 | 
-pnote Note y" single=";"0.0 0.0 +pnote Note 0.0 0.0 | Helvetica | 10 | 
-map_st_x Map Start X 0.0 0.0 +map_st_x Map Start X | | 0.0 0.0 | Helvetica | 10 | 
-map_st_y Map Start Y 0.0 0.0 +map_st_y Map Start Y | | 0.0 0.0 | Helvetica | 10 | 
-map_st_z Map Start Z 0.0 0.0 +map_st_z Map Start Z | | 0.0 0.0 | Helvetica | 10 | 
-map_ed_x Map End X 0.0 0.0 +map_ed_x Map End X | | 0.0 0.0 | Helvetica | 10 | 
-map_ed_y Map End Y 0.0 0.0 +map_ed_y Map End Y | | 0.0 0.0 | Helvetica | 10 | 
-map_ed_z Map End Z 0.0 0.0 +map_ed_z Map End Z | | 0.0 0.0 | Helvetica | 10 | 
-map_axis Map Axis ; y ; 0.0 0.0 6 +map_axis Map Axis | | 0.0 0.0 | Helvetica | 12 |
-</sxh>+
 ==== Examples ==== ==== Examples ====
-<sxh xml>+ 
 +===== template ===== 
 +<code xml> 
 +<?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> 
 +</code> 
 +<code xml>
 <?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
 <key> <key>
Line 1614: Line 1679:
     <filevers>4.2</filevers>     <filevers>4.2</filevers>
 </key> </key>
-</sxh>+</code>
  
-===== template ===== +==== Lib maker ==== 
-<sxh xml> +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
-<?xml version="1.0" encoding="utf-8"?> +<code python
-<key+import tkinter as tk 
-    <lamps> +from tkinter import filedialog, messagebox, ttk 
-        <properties> +import xml.etree.ElementTree as ET 
-            #Thu Jan 15 16:34:27 CET 2026+import os
  
-        </properties> +class XMLExtractorApp: 
-    </lamps> +    def __init__(self, root): 
-    <frames> +        self.root = root 
-        <properties> +        self.root.title("XML Shape to Symbol Extractor"
-            #Thu Jan 15 16:34:27 CET 2026+        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")
  
-        </properties> +if __name__ == "__main__": 
-    </frames> +    root = tk.Tk() 
-    <kentry> +    app = XMLExtractorApp(root) 
-        <kind>misc</kind> +    root.mainloop() 
-        <name>toto</name>+</code>
  
-        <custom> +==== js version ==== 
-            <symbol+<code javascript
-                <id>4b6ca21a-1202-4b37-9121-281572b09a7d</id+<!DOCTYPE html
-                <group+<html lang="fr"
-                    <shape> + 
-                        <class>LXGroup</class+<head
-                        <shapes+    <meta charset="UTF-8"
-                        <shape> +    <meta name="viewport" content="width=device-widthinitial-scale=1.0"
-                            <class>LXShape</class> +    <title>Lxplan lib builder</title
-                            <brectx>144.0</brectx> +    <style
-                            <brecty>452.0</brecty> +        body { 
-                            <brectw>86.0</brectw> +            font-family: Arial, sans-serif; 
-                            <brecth>135.0</brecth> +            margin: 20px; 
-                            <rotate>0.0</rotate> +            line-height: 1.6; 
-                            <drawSt>y</drawSt> +        } 
-                            <stWidth>1.0</stWidth> + 
-                            <stColor>0.0,0.0,0.0,1.0</stColor+        textarea { 
-                            <drawFl>y</drawFl+            width: 100%; 
-                            <flColor>1.0,1.0,1.0,1.0</flColor+            height: 200px; 
-                            <lnStyle>0</lnStyle> +            margin: 10px 0; 
-                            <lock>n</lock> +        } 
-                        </shape> + 
-                        <shape> +        button { 
-                            <class>LXLineShape</class> +            padding: 8px 16px; 
-                            <brectx>130.0</brectx> +            background-color: #007BFF; 
-                            <brecty>550.0</brecty> +            color: white; 
-                            <brectw>132.0</brectw> +            border: none; 
-                            <brecth>1.0</brecth> +            border-radius: 4px; 
-                            <rotate>0.0</rotate> +            cursor: pointer; 
-                            <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+        button:hover { 
-</key> +            background-color: #0056b3; 
-</sxh>+        } 
 + 
 +        .test-result>span { 
 +            font-weight: bold; 
 +            padding: 5px; 
 +        } 
 + 
 +        .valid { 
 +            color: white; 
 +            background-color: green; 
 +        } 
 + 
 +        .invalid { 
 +            color: white; 
 +            background-color: red; 
 +        } 
 + 
 +        .no-answer { 
 +            color: black; 
 +            background-color: white; 
 +        } 
 + 
 +        .container { 
 +            border: 1px solid black; 
 +            border-radius: 5px; 
 +            margin: 5px; 
 +            padding: 10px; 
 +        } 
 +    </style> 
 +</head> 
 + 
 +<body> 
 +    <h1>Lxplan lib builder</h1> 
 +    <div class="container"> 
 +        <details> 
 +            <summary>Cliquer içi pour lire 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 class="container"> 
 +        <h2>Charger le fichier lxxplot</h2> 
 +        <p>Sélectionnez un fichier llxplot sur votre appareil :</p> 
 +        <input type="file" id="fileInput" accept=".lxxplot" onclick="resetChecks()" /> 
 +    </div> 
 +    <div class="container"> 
 +        <h2>Tester le fichier lxxplot</h2> 
 +        <div>Le fichier est il un lxxplot ? : <span id="isLxxplot" class="test-result">...</span></div> 
 +        <div>Le fichier possede t il une shape sur le premier layer ? :<span id="hasShape" 
 +                class="test-result">...</span></div> 
 +        <div>La shape, commence t elle par un groupe ? :<span id="hasGroup" class="test-result">...</span></div> 
 +        <button onclick="loadFile()">Tester le fichier</button> 
 +    </div> 
 +    <div id="dataFields" class="container" hidden> 
 +        <h2>Données de la librairie</h2> 
 +        <div class="form-section"> 
 +            <div id="mandatoryFields"> 
 +                <h3>Champs obligatoires</h3> 
 +                <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> 
 +                    <label for="dataType">Type d'appareil</label> 
 +                    <select id="dataType"> 
 +                        <option value="">Sélectionner un type d'appareil</option> 
 +                    </select> 
 +                </div> 
 +            </div> 
 +            <div id="optionalFields"> 
 +                <h3>Champs optionnels</h3> 
 +                <details> 
 +                    <summary> 
 +                        Cliquer içi pour editer les champs optionnels 
 +                    </summary> 
 +                    <div id="dynamicFields">Selectionner d'abord un type d'appareil</div> 
 +                </details> 
 +            </div> 
 +            <button id="saveButton" onclick="buildOutput()">Créer la librairie</button> 
 +        </div> 
 +    </div> 
 + 
 +    <script> 
 +        // declaration des variables 
 +        var xmlInputContent = ""; 
 +        var xmlOutputContent = ""; 
 +        var shape = ""; 
 +        var isLxxplot = false; 
 +        var hasShape = false; 
 +        var hasGroup = false; 
 +        var filledOptionalFields = undefined; 
 +        var filledFields = []; 
 +        var isLxxplotDiv = document.getElementById("isLxxplot"); 
 +        var hasShapeDiv = document.getElementById("hasShape"); 
 +        var hasGroupDiv = document.getElementById("hasGroup"); 
 +        var dataFields = document.getElementById("dataFields"); 
 +        var dataTypeSelect = document.getElementById('dataType'); 
 +        var dynamicFields = document.getElementById('dynamicFields'); 
 + 
 +        // Tableau des options de la liste de sélection 
 +        const selectOptions = [ 
 +            { id: "ers", 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", 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", 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", 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", 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" }, 
 +        ]; 
 + 
 +        // reinitialise les resultats du test de fichier 
 +        function resetChecks() { 
 +            let content = '<span class="no-answer">Sans avis</span>'; 
 +            isLxxplotDiv.innerHTML = content; 
 +            hasShapeDiv.innerHTML = content; 
 +            hasGroupDiv.innerHTML = content; 
 +            dataFields.hidden = true; 
 +        } 
 + 
 +        // action quand le document est bien chargé 
 +        document.addEventListener('DOMContentLoaded', () => { 
 +            resetChecks(); 
 +            fillSelectOptions(); 
 +        }); 
 + 
 +        // Remplit la liste déroulante de type d'appareil 
 +        function fillSelectOptions() { 
 +            dataTypeSelect.innerHTML = '<option value="">Sélectionner un type d\'appareil</option>'; 
 +            selectOptions.forEach((option) => { 
 +                const optElement = document.createElement("option"); 
 +                optElement.value = option.id; 
 +                optElement.textContent = option.label; 
 +                dataTypeSelect.appendChild(optElement); 
 +            }); 
 +        } 
 + 
 +        // ecoute si le type d'appareil est changé 
 +        dataTypeSelect.addEventListener("change", () => { 
 +            const selectedOptionId = dataTypeSelect.value; 
 +            displayDynamicFields(selectedOptionId); 
 +        }); 
 + 
 +        // Affiche les champs optionnels en fonction du type d'appareil sélectionné 
 +        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); 
 +                } 
 +            }); 
 +        } 
 + 
 +        // charge le fichier lxxplot 
 +        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; 
 +                dataFields.hidden = !runChecks(); 
 +            }; 
 +            reader.readAsText(file); 
 +        } 
 + 
 +        // verifie le contenu du fichier lxxplot 
 +        function runChecks() { 
 +            isLxxplot = checkIfValidPath("/lxplot", 'isLxxplot'); 
 +            hasShape = checkIfValidPath("/lxplot/layers/layer/shape", 'hasShape'); 
 +            if (hasShape) { 
 +                getShape(); 
 +            } 
 +            hasGroup = checkIfValidPath("/lxplot/layers/layer/shape/class[text() = 'LXGroup']", 'hasGroup'); 
 +            return (isLxxplot && hasShape && hasGroup); 
 +        } 
 + 
 +        // petit utilitaire pour tester le contenu du fichier lxxplot 
 +        function checkIfValidPath(xpathQuery, resultDiv) { 
 +            resultDiv = document.getElementById(resultDiv); 
 +            let status = parseXml(xpathQuery).status; 
 +            resultDiv.innerHTML = status ? '<span class="valid">oui</span>' : '<span class="invalid">non</span>'; 
 +            return status; 
 +        } 
 + 
 +        // petit utilitaire permettant de tester le xml du fichier lxxplot 
 +        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) { 
 +                console.error("error parsing xml", e.message); 
 +                return { "status": false, "data": "Error : " + e.message }; 
 +            } 
 +        } 
 + 
 +        // reuperer la shape depuis le fichier lxxplot 
 +        function getShape() { 
 +            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( 
 +                    "/lxplot/layers/layer/shape", 
 +                    xmlDoc, 
 +                    null, 
 +                    XPathResult.FIRST_ORDERED_NODE_TYPE, 
 +                    null 
 +                ); 
 + 
 +                shape = xpathResult.singleNodeValue; 
 +            } catch (e) { 
 +                console.error("error parsing xml", e.message); 
 +                return { "status": false, "data": "Error : " + e.message }; 
 +            } 
 +        } 
 + 
 +        // action quand on appuie sur le bouton "creer la librairie" 
 +        function buildOutput() { 
 +            if (checkFilledFields()) { 
 +                buildXmlOutput(); 
 +            } 
 +        } 
 + 
 +        // verifier que les champs soient bien remplis 
 +        function checkFilledFields() { 
 +            filledFields = []; 
 +            getFilledChildren('mandatoryFields'); 
 +            if (Object.keys(filledFields).length < 3 || dataTypeSelect.value === '') { 
 +                alert("Les 4 champs obligatoires doivent être remplis."); 
 +                return false; 
 +            } 
 +            getFilledChildren('dynamicFields'); 
 +            return true; 
 +        } 
 + 
 +        function getFilledChildren(id) { 
 +            // recupere les champs 
 +            const divElement = document.getElementById(id); 
 +            const inputNodes = divElement.getElementsByTagName('input'); 
 + 
 +            // teste les champs un par un 
 +            for (let i = 0; i < inputNodes.length; i++) { 
 +                if (inputNodes[i].value.trim() !== '') { 
 +                    filledFields.push({ "id": inputNodes[i].id, "value": inputNodes[i].value }); 
 +                } 
 +            } 
 +        } 
 + 
 +        // fabrique le fichier de sortie et l'envoie a l'utilisateur 
 +        function buildXmlOutput() { 
 +            // creation du document xml 
 +            const xmlDoc = new DOMParser().parseFromString('<key></key>', 'application/xml'); 
 +            const root = xmlDoc.documentElement; 
 + 
 +            // creation des elements basiques 
 +            const kentryElement = xmlDoc.createElement('kentry'); 
 +            const customElement = xmlDoc.createElement("custom"); 
 +            const symbolElement = xmlDoc.createElement("symbol"); 
 +            const groupElement = xmlDoc.createElement("group"); 
 +            const kindElement = xmlDoc.createElement("kind"); 
 +            kindElement.textContent = dataTypeSelect.value; 
 + 
 +            // ajout des elements basiques dans l'arbre xml 
 +            groupElement.appendChild(shape); 
 +            symbolElement.appendChild(groupElement); 
 +            customElement.appendChild(symbolElement); 
 +            kentryElement.appendChild(kindElement); 
 + 
 +            // ajout de chaque champ rempli 
 +            filledFields.forEach((item) => { 
 +                const newItem = xmlDoc.createElement(item.id); 
 +                newItem.textContent = item.value; 
 +                kentryElement.appendChild(newItem); 
 +            }); 
 + 
 +            kentryElement.appendChild(customElement); 
 +            root.appendChild(kentryElement); 
 + 
 +            // conversion en chaine de characteres 
 +            const xmlString = "<?xml version='1.0' encoding='utf-8'?>\n" + new XMLSerializer().serializeToString(xmlDoc); 
 +            console.log(xmlString); 
 + 
 +            // creation fichier 
 +            const blob = new Blob([xmlString], { type: 'application/xml;charset=utf-8' }); 
 +            const url = URL.createObjectURL(blob); 
 + 
 +            // envoi du fichier 
 +            const a = document.createElement('a'); 
 +            a.href = url; 
 +            a.download = 'mylib.lxkey'; 
 +            a.click(); 
 + 
 +            // nettoyage 
 +            URL.revokeObjectURL(url); 
 +        } 
 +    </script
 +</body>
  
 +</html>
 +</code>

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also, you acknowledge that you have read and understand our Privacy Policy. If you do not agree, please leave the website.

More information