N VectorWorks 9eVectorWorks '`L A'`X'`x?n&׿2N`H@D89@=* P$?'`'`'`'`'a,'aT'`X'` '`|'`x'`'`x'`h'`'`8'`,'`'`$'`'`('`d'`@'`T'`P'`'`'`'`'`'`'`'`'`'`'` '`$? Dec Ft & Inch"'-  sq ft cubic ft'`@C kFm'`,?H,InteractiveRenderer'`H@Iffffff@Iffffff@|33333@|33333@@ȣr`b;H?:׫ *?K]y,!A'`'`H'`'`'`'`'`D'`'`d'`'`'`'`X'`'`'`'`,'`'`'`H'`'` '`'`'` '``'`'`'`('`'`'`X'`'`d'`|'`X'` '` '`'`'`'`'`'`l'`$'`'` '`('`'`'` '`@'`'`,'``'`'`'`'`'`'`<'`l'`d'`d'`@'`'`l'`'`'`'`t'`'`'`'`'`'`h'`p'``'`\'`d'`T'`t'`P'`X'`H'`D'`L'`<'`@'`4'`8'`,'`0'`$'`('`'`'`'` '`'`'`'`'`'` '`0'`'`'`'`'`'`'`D'`'`'`'`'`'`'`'`'`h'`l'`|'`'`L'`'`'`$'`,'`x'`t'`'`|'`'`'`<'`'`'`'`@'`<'`H'` '`'`'` '`'`'`'`'`'`'`'`'`x'`'`P'`$'`'` '`'`'`'`h'`D'`'`'`'`t'`X'`'`'`'`'`'`x'`X'`@'`('`h'`D'`<'`'`'`'`@'`D'`'`'`'`'`'`'`'`'`'`'`|'`'`'`'`'`|'`p'`t'`<'`p'`H'`8'`<'`'`'`'`X'`T'`P'`L'`H'`@'`('`$'`0'`'`'` '`'`'`'`@'`,'`'`'`'`|'`<'`('`'`'`'`x'`@'`Py,O@nN!B $H_ HHV!B $HnN @HPHHV @nNP PHpHHVP PnNA (PHHHVA (PnN@"D HHHV@"D nNB@HЀHHVB@nNp8uHHVp8nN8pH"HHV8pnN|HHV nNH$PHHV nND"D"H%pHHVD"D" nN"D"DH&HHV"D"D nNH'HHV nND"D"NHHVD"D"nN"D"DHHV"D"DnN""H+HHV""nNLS-YFH,0HHVLS-YFnNf3f3r@HHVf3f3nN!B $HH.pHHV!B $HnN""""H/HHV""""nNB<0HHV!nNH?PHHV"nNH@pHHV#ND8DHA HHDDDD8888DDDDDDDD8888DDDDDDDD8888DDDDDDDD8888DDDD"y,X@$y,L@LWDDRy,A@'`l'`by,B`@ ??qr?88?*by,Bt@ ??qq?UUUUUU? $,@y,JAPalatino V&& <Ɠ(& -dƟ&Ƣ Ƣ && &,& ί0Ɵ& &*Ɵ&@X&X& 4 ֱO &&0\&P &P@XBookman918@ @@%@<O*p`918"@ @@%@<O*918^@ @@%@J< O* 918@ "MH O*JJ<88" HelveticaND@gx@ !@g@oh!o!op$pFONDo@ohAP DoH@g@o!o!oohoAAorbhFONDFONDArialm3`XUt@t( (( 70es lines ln@Align Lights L/R Cen@Ap 2 Boom SL-0OIk`k k`k`C/$O,kpBHgHz 2 Boom SR-0OIk`k k`k`C/$O,kpBHgHl 2 Electric OIk`k k`k`C/$O,kpBHgH 3 Boom SL-0OIk`k k`k`C/$O,kpBHgH} 3 Boom SR-0OIk`k k`k`C/$O,kpBHgHm 3 Electric OIk`k k`k`C/$O,kpBHgHn 4 Electric OIk`k k`k`C/$O,kpBHgHo 5 Electric-0OIk`k k`k`C/$O,kpBHgH/ 50A Ckt Boxricso@eCRT-44$L@Cyc cell{ 6 Electric-0OIk`k k`k`C/$O,kpBHgH| 7 Electric-0OIk`k k`k`C/$O,kpBHgH~ 8 Electric-0OIk`k k`k`C/$O,kpBHgH 8' R-40 STRIP@Distribute & Select`Distribute along lin@ 9 Electric-0OIk`k k`k`C/$O,kpBHgH 9' R-40 STRIPVariation@Distribute: Along Li@Distribute: S>70k̐k\OIk̐F\8k̐" $SXC/$gHAlign Lights L/R Cenk̐]k̐" "SXC/$gHAlign Lights T/B Cenk̐T]k̐" "SXC/$gHAlign LR on insertk̐Ztk̐" "SX( k\gHAlign TB on insertk̐ Zdk̐" "SX( k\gH All ElectricsIk̐&^ k̐" $SXC/$gH Beam SectionOIk̐Vk̐" "SX( k\gHBeam Section-0Ik̐U`k̐" "SX( k\gH Beam SpreadOIk̐ Vk̐" "SX( k\gHBeam Spread (not Impk̐^k̐" "SXC/$gHBeam Spread Metrick̐VLk̐" "SX( k\gHBeam Spread WKSIk̐Uk̐" "SX( k\gH( Boom Positionfo-0 Pi@Leadered Label-@LegendPosBoyd's Symbolsnd Metrict@ Lighting Macrosu,yLightCenter: Two Pointsk̐DP0k̐" $SX( k\gHChange one field - ak̐Ok̐" "SX( k\gHChange Position Namek̐JZ<k̐" "SX( k\gHChange record data -k̐ AO|k̐" "SX( k\gHChange record data-0k̐4Ok̐" "SX( k\gHCirclek\OIk̐R\,k̐" $SXC/$gH. Circuit BoxNumber 4 cir strip@Number 4 Cir Strips@NCLUE-0`k OIk`k k`k`C/$O,kpBHgHCollect Dimensionsk̐Vk̐" "SX( k\gHcommandk\OIk̐m\0k̐" $SXC/$gH>Commandsmber Selected from@Number SL Boomd@Number SRCreditsk\OIk̐&^k̐" $SXC/$gHeCRTnt7PAR NSP - backI_@XPAR NSP - front_@$BP@Cyc cellk_@XPAR VNSP - front@XQPAR WFL - backmМiData Export to LW24Par56 8' Strip`Plot Macros v14.5G DATAFLASHal o]$B Q360/6x16ђ Q360/6x22ђ` Default Hatchto Symbols@ Referencent t @ Replace GDelete Unpositionedk̐Ypk̐" "SX( k\gHDelete Unpositioned k̐ ]k̐" "SXC/$gH] Dimension OIk`k k`k`C/$O,kpBHgHDimension From Ctrk̐ Vk̐" "SX( k\gHDimension Sequentialk̐hVk̐" "SX( k\gHDimmerk\OIk̐>\(k̐" $SXC/$gHDistribute & Selectntx_J s4/50 side_3 SavedDistribute along link̐Tk̐" "SX( k\gHDistribute Symbols ak̐Sk̐" "SX( k\gHDistribute Symbols bk̐ eSk̐" "SX( k\gHDistribute Symbols ok̐ USk̐" "SX( k\gHDistribute Variationk̐#Tk̐" "SX( k\gHDistribute: Along Lik̐Qpk̐" "SX( k\gHDistribute: Set Ink̐ Rk̐" "SX( k\gHDoMenu (Flip Horiz-0k̐BP4k̐" $SX( k\gHDoMenu (Flip Vert)-0k̐ Ppk̐" "SX( k\gH Drawing: MoveIk̐qRk̐" "SX( k\gHDrawing: NudgeIk̐Rk̐" "SX( k\gHDrawing: Rescale %k̐;R\k̐" $SX( k\gHDS Deckk OIk`k k`k`C/$O,kpBHgHEnter Data For Positk̐J]k̐" "SXC/$gHEnter Data for Seleck̐Yhk̐" "SX( k\gHEnter Data SR to SLk̐ V0k̐" "SX( k\gHEnter Posit on Seleck̐Ydk̐" "SX( k\gHEnter Position on Sek̐ \k̐" "SXC/$gHErase Fixture IDsIk̐"Uk̐" "SX( k\gH"ETC 10ETC 58FAR CYC9 Far Cyc - 3Dfiagaro count export Find 6x12'sOIk̐=Ulk̐" $SX( k\gH Find 6x16'sOIk̐>Uhk̐" $SX( k\gH Find 6x9's\OIk̐Uk̐" "SX( k\gH FOH BalconyOIk`k k`k`C/$O,kpBHgHFOH Family Cir.Ik`k k`k`C/$O,kpBHgHvFOH Upper Box SL-0k`k k`k`C/$O,kpBHgHwFOH Upper Box SR-0k`k k`k`C/$O,kpBHgHM G300 Hazerbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb Get: Scale\OIk̐tQk̐" "SX( k\gHu Groundrow-0OIk`k k`k`C/$O,kpBHgHGroup 1k\OIk̐U\4k̐" $SXC/$gHHanging PositionsIk̐JHk̐4N7C/$gHHide: SelectedIk̐-Rk̐" "SX( k\gHHide: UnselectedIk̐Rk̐" "SX( k\gHVInfo'Ladder Position Layer Thing LayerInfo-0OIk̐P,k̐" "SX( k\gHLeadered LabelIk̐[hk̐" "SX( k\gHLegendk\OIk̐YPk̐" "SX( k\gH Legend MetricIk̐,V(k̐" "SX( k\gH Lighting MacrosLightsLine: Break LineIk̐Sk̐" "SX( k\gHLine: Cut LineIk̐zSpk̐" "SX( k\gHLine: Divide LineIk̐Q<k̐" "SX( k\gHlines lines lines yek̐\|k̐" "SXC/$gHxLOBXL-0k OIk`k k`k`C/$O,kpBHgHyLOBXR-0k OIk`k k`k`C/$O,kpBHgHLtg Grid: HideIk̐;R`k̐" $SX( k\gHLtg Grid: ShowIk̐0Rdk̐" "SX( k\gH Make Prefs\OIk̐ZUk̐" "SX( k\gHMove: Point to Pointk̐Qk̐" "SX( k\gH&MR-16 StriplightMS Deckk OIk`k k`k`C/$O,kpBHgH No Lights\OIk̐&^(k̐" $SXC/$gHKNonek`k OIk`k k`k`C/$O,kpBHgHNumber 3 cir stripk̐]k̐" "SXC/$gHNumber 3 Cir Stripsk̐ Y4k̐" "SX( k\gHNumber 3 Cir Strips k̐ V k̐" "SX( k\gHNumber 4 cir stripk̐]k̐" "SXC/$gHNumber 4 Cir Stripsk̐UY,k̐" "SX( k\gHNumber 4 Cir Strips k̐pVk̐" "SX( k\gHNumber DS to USIk̐Yk̐" "SX( k\gHNumber PositionIk̐Yk̐" "SX( k\gHNumber Position (stak̐ \k̐" "SXC/$gHNumber SelectedIk̐(\k̐" "SXC/$gHNumber Selected as Sk̐e]<k̐" "SXC/$gHNumber Selected as-0k̐]Dk̐" "SXC/$gHNumber Selected f SLk̐Yk̐" "SX( k\gHNumber Selected f SRk̐Xk̐" "SX( k\gHNumber Selected fromk̐T]k̐" "SXC/$gHNumber SL BoomIk̐~X<k̐" "SX( k\gHNumber SR BoomIk̐_X0k̐" "SX( k\gH+ PAR boom base6PAR MFL - back7PAR MFL - frontPAR NSP - backPAR NSP - frontPAR VNSP - backPAR VNSP - frontQPAR WFL - backRPAR WFL - front4Par56 8' StripPlot Macros v14.5.1; practical Q360/6x16 Q360/6x22Record to SymbolsIk̐Ok̐" "SX( k\gH Reference\OIk̐Qk̐" "SX( k\gH Replace GroupIk̐sV k̐" "SX( k\gHReplace SymbolIk̐>Udk̐" $SX( k\gHReplace Symbol-0Ik̐ܔk̐( k\gHReplace Symbol-0-0k̐Uk̐" "SX( k\gHReplace Symbol-0-1k̐Tk̐" "SX( k\gH Reset OriginOIk̐SSk̐" "SX( k\gH S4/10 front S4/19 back S4/19 front S4/19 side S4/26 backO S4/26 front S4/26 side S4/36 back S4/36 front S4/36 sideP S4/5 frontU s4/50 back< S4/50 frontJ s4/50 side3 Saved SheetsN_adca^_ebbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaabbSelect By Channel Sak̐HSk̐" "SX( k\gHSelect By Circuit Sak̐Sk̐" "SX( k\gHSelect By Posit. & Tk̐Sk̐" "SX( k\gHSelect By Position Sk̐Tk̐" "SX( k\gHSelect By Type Samplk̐Sk̐" "SX( k\gH Set Height\OIk̐ Uk̐" "SX( k\gH Set Mounts-0OIk`k k`k`C/$O,kpBHgH Set Origin\OIk̐Rk̐" "SX( k\gH Show: All\OIk̐Rlk̐" "SX( k\gHSL Portal Boom-0Ik`k k`k`C/$O,kpBHgH SL ROVER 1-0OIk`k k`k`C/$O,kpBHgHSpace Horiz from Ctrk̐}Xk̐" "SX( k\gHSpace Horiz from SLk̐Xk̐" "SX( k\gHSpace Horiz from SRk̐Uk̐" "SX( k\gHSpace Horiz in Openik̐fVk̐" "SX( k\gHSpace Horizontallyk̐]k̐" "SXC/$gHSpace Vert from Botk̐Uk̐" "SX( k\gHSpace Vert from Topk̐ Wk̐" "SX( k\gHSpace VerticallyIk̐ ]k̐" "SXC/$gHSR Portal BoomSR Portal Boom-0Ik`k k`k`C/$O,kpBHgHStamp: Date & File-0k̐Ok̐" "SX( k\gHStamp: Date StampIk̐RPk̐" "SX( k\gHStamp: File NameIk̐RXk̐" "SX( k\gHtStandard=Strip1STRIPS SuperNudge OIk̐!Sk̐" "SX( k\gHSymbol: Edit DataIk̐/S|k̐" "SX( k\gH Text: Find/Replacek̐Sk̐" "SX( k\gHText: Font Changerk̐Rk̐" "SX( k\gH Toggle: B&W-0Ik̐Qk̐" "SX( k\gHToggle: Objs in Grpsk̐Rk̐" $SX( k\gHToggle: OffsetDupek̐Ok̐" "SX( k\gH Tools ... Transfer Data Panek̐Sk̐" "SX( k\gHTwofer SelectedIk̐ W\k̐" "SX( k\gH TwoferBump-HOIk̐ W[ k̐" "SX( k\gH TwoferBump-VOIk̐[Zk̐" "SX( k\gHaUntitled WorksheetgUntitled Worksheet-0#Untitled Worksheet-1BUntitled Worksheet-2Peaca_ccfbbbbbbbbbbbbbbbbbbbbbbUS Deckk OIk`k k`k`C/$O,kpBHgHHuvabbbbbbbbbbbbbbaaaa^bda`a[``_c`aaaabbbbaaabbbbbbbbbbbbb`bccba Zoom SpecificIk̐ (Zk̐" "SX( k\gH `Export DataOIk̐;W@k̐" "SX( k\gH`Export Data w Labelk̐Vk̐" "SX( k\gH`EXPORT to Hook Upk̐],k̐" "SXC/$gH `Import Data Ik̐3Wk̐" "SX( k\gH`IMPORT from Hook Upk̐ B]k̐" "SXC/$gH{Edit Symbol RecordRy,9A'`d'`ly,pA6 $ PHHd'x(HH$ P6 hh2'204"E6ME Ly,^KA@Ly,^]A@Ly,^A@Ly,^A@Ly,^A@Ly,^A@Ly,^A@Ly,^A@Ly,^A@Ly,^A@Ly,^A@Ly,^A@Ly,^A@Ly,^A@Ly,^A@Ly,^A@Ly,^A@Ly,^~A@Ly,^}A@Ly,^|A@Ly,^{A@Ly,^zA@Ly,^yA@Ly,^xA@Ly,^wA@Ly,^vA@Ly,^uA@Ly,^pA@Ly,^oA@Ly,^nA@Ly,^mA@Ly,^lA@Ly,^kA@Ry,NA'`x'`x$Hy,'`/eACRT { rq?00Ae27-28Ty,33@((("'`'`&y,'`1A+A?8?8:H9@;#89@1ꪪ???@=hR@2?5@=hR=hR=hR@=hRK L0klmno{|~]vwuxyKpz}&y,'`1A+A?XHqH9@9UUUUU@2UUUUU???@=hR@2?5@=hR=hR=hR@=hRK L0klmno{|~]vwuxyKpz}&y,'`1A+A?XHqH9@9UUUUU@2UUUUU???@=hR@3d8@=>=>=>@=>K L0klmno{|~]vwuxyKpz}$Ty,3 @^s^"+'`'`hy,'`1@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} Procedure Credits; {===================================================} PROCEDURE MakDlog; var item:integer; msgStr1:string; msgStr2:string; msgStr3:string; msgStr4:string; msgStr5:string; msgStr6:string; CR:string; BEGIN item:=1; CR:=Chr(13); BeginDialog(1,1,57,33,366,340); AddButton('OK',1,1, 104,279,182,300); msgStr1:='Macros Developed by Samuel L. Jones'; msgStr2:='in consultation with Stan Pressner'; msgStr3:='Copyright June 1993'; msgStr4:='Version 5.0v1.1'; msgStr5:='If they are useful - send $25 to the address below'; msgStr6:=concat(msgStr1, CR, msgStr2, CR, msgStr3, CR, msgStr4, CR, CR, msgStr5); AddField(msgStr6, 2,1, 28,4,292,123); msgStr1:='For support and input'; msgStr2:='Samuel L. Jones'; msgStr3:='12130 Ohio Ave. #306'; msgStr4:='Los Angeles, CA 90025'; msgStr6:=concat(msgStr1,CR, msgStr2, CR, msgStr3, CR, msgStr4); AddField(msgStr6, 3, 1, 56,124,280,192); msgStr1:='Phone: (310) 825-5823'; msgStr2:=' (310) 207-0392'; msgStr3:='Samuel L. Jones 74634,2526 (CIS)'; msgStr4:='sjones@emelnitz.ucla.edu'; msgStr6:=concat(msgStr1, CR, msgStr2, CR, msgStr3, CR, msgStr4); AddField(msgStr6, 4, 1, 28,200,262,275); EndDialog; END; {Procedure MakDlog} {===================================================} Procedure ShowCredits; Var item:integer; Begin MakDlog; GetDialog(1); REPEAT DialogEvent(item); UNTIL (item=1) ; ClrDialog; End; {Procedure ShowCredits} {===================================================} Begin ShowCredits; End; {Procedure Credits} Run(Credits); ny,;An;AJy,1@${Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} Procedure BeamSpread; var ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; YArray:array[1..100] of REAL; Spread:REAL; Hight:REAL; Misc2:REAL; NewYArray:array[1..100] of REAL; RealX:REAL; RealY:Real; FocusX:REAL; FocusY:REAL; Dist:REAL; Throw:REAL; FarHitX:REAL; FarHitY:REAL; CloseHitX:REAL; CloseHitY:REAL; LeftHitX:REAL; LeftHitY:REAL; RightHitX:REAL; RightHitY:REAL; AngleToFocus:REAL; AngleToClose:REAL; AngleToFar:REAL; AngleResult:REAL; NumberOfLights:integer; Ok:boolean; PositionStr:string; PositionMatch:string; AlertStr:string; {---------------------------------------------------------} BEGIN {BeamSpread} Units(3,100); Spread:=IntDialog('Degree Spread', '0'); IF Spread <> 0 THEN LayerHandle:=FLayer; ObjHandle:=FSObject(LayerHandle); IF GetType(ObjHandle)=15 THEN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); Hight:=12*Str2Num(EvalStr(ObjHandle,('Lights'.'Miscl#2'))); GetPt(FocusX,FocusY); Dist:=Distance(RealX,RealY,FocusX,FocusY); Throw:=Sqrt((Hight*Hight)+(Dist*Dist)); ANGLEVAR; AngleResult:=Dist/Throw; AlertStr:=concat('AngleResult = ',Num2StrF(AngleResult)); AlrtDialog(AlertStr); AngleToFocus:=ArcSin(AngleResult); AngleToFocus:=Rad2Deg(AngleToFocus); AlertStr:=concat('AngleToFocus = ',Num2StrF(AngleToFocus)); AlrtDialog(AlertStr); END; {IF (RecHandle<>NIL)} END; {IF GetType(ObjHandle)=15} END; {IF Space <> 0} Units(1,3); SysBeep; END; {Procedure BeamSpread} RUN(BeamSpread);y,'`1@\{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This macro is different from entering data in the Data Window, because it will query each light individually that has the matching position. This allows you to assign different data to different instruments on a position} Procedure EnterDataForPosition; var ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; NumberOfLights:integer; RealHolder:REAL; StringHolder:string; Ok:boolean; PositionStr:string; PositionMatch:string; item:integer; {---------------------------------------------------------} PROCEDURE FillArray(positionStr:string); Var index:integer; RealX,RealY:REAL; BEGIN NumberOfLights:=0; LayerHandle:=FLayer; WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FInLayer(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch:=EvalStr(ObjHandle,('Lights'.'Position' = positionStr)); IF PositionMatch='True' THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:=RealX; END; {IF PositionMatch='True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END; {Procedure FillArray} {---------------------------------------------------------} Procedure SortArray; var index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; noChange:boolean; cirString:string; realHolder:REAL; Begin REPEAT noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO Begin IF XArray[index1]XArray[index2]} End; {FOR index2:=index1+1 to NumberOfLights} {FOR index1:=1 to NumberOfLights-1} UNTIL (noChange); End; {Procedure SortArray} {---------------------------------------------------------} PROCEDURE MakDlog; var item:integer; BEGIN item:=1; BeginDialog(1,1,22,30,317,365); AddButton('Enter',1,1,188,309,246,329); AddButton('Finished',2,1,34,309,92,329); AddField('Unit#:',3,1,14,6,89,22); AddField('Position:',4,1,14,29,89,45); AddField('Channel:',5,1,14,52,89,68); AddField('Color:',6,1,14,75,89,91); AddField('Short Purp:',7,1,14,98,89,114); AddField('Circuit:',8,1,14,122,89,137); AddField('Dimmer:',9,1,14,145,89,160); AddField('Purpose:',10,1,14,168,89,183); AddField('Template:',11,1,14,191,89,206); AddField('Miscl#1:',12,1,14,214,89,229); AddField('Miscl#2:',13,1,14,237,89,252); AddField('Type:',14,1,14,260,89,275); AddField('Wattage:',15,1,14,283,89,298); AddField('#',16,2,94,6,283,22); AddField('Position',17,2,94,29,283,45); AddField('Cha',18,2,94,52,283,68); AddField('Col',19,2,94,75,283,91); AddField('Short P',20,2,94,98,283,114); AddField('Cir',21,2,94,122,283,137); AddField('Dim',22,2,94,145,283,160); AddField('Purp',23,2,94,168,283,183); AddField('Temp',24,2,94,191,283,206); AddField('Misc1',25,2,94,214,283,229); AddField('Misc2',26,2,94,237,283,252); AddField('Type',27,2,94,260,283,275); AddField('Wattage',28,2,94,283,283,298); EndDialog; END; {Procedure MakDlog} {===================================================} Procedure QueryValues; const unitfld=16; posfld=17; chanfld=18; colorfld=19; shortfld=20; cirfld=21; dimfld=22; purpfld=23; tempfld=24; misc1fld=25; misc2fld=26; typefld=27; wattfld=28; Var index:integer; item:integer; realIndex:REAL; stringHolder:string; pos,unit,cir,chan,color,dim,purp,temp,misc1,misc2,unittype,watt:string; handleHolder:Handle; Begin MakDlog; GetDialog(1); FOR index:=1 to NumberOfLights DO Begin realIndex:=index; unit:=EvalStr(HandleArray[index],('Lights'.'Unit #')); SetField(unitfld,unit); pos:=EvalStr(HandleArray[index],('Lights'.'Position')); SetField(posfld,pos); cir:=EvalStr(HandleArray[index],('Lights'.'Circuit')); SetField(cirfld,cir); chan:=EvalStr(HandleArray[index],('Lights'.'Channel')); SetField(chanfld,chan); color:=EvalStr(HandleArray[index],('Lights'.'Color')); SetField(colorfld,color); dim:=EvalStr(HandleArray[index],('Lights'.'Dimmer')); SetField(dimfld,dim); purp:=EvalStr(HandleArray[index],('Lights'.'Purpose')); SetField(purpfld,purp); temp:=EvalStr(HandleArray[index],('Lights'.'Template')); SetField(tempfld,temp); misc1:=EvalStr(HandleArray[index],('Lights'.'Miscl#1')); SetField(misc1fld,misc1); misc2:=EvalStr(HandleArray[index],('Lights'.'Miscl#2')); SetField(misc2fld,misc2); unittype:=EvalStr(HandleArray[index],('Lights'.'Type')); SetField(typefld,unittype); watt:=EvalStr(HandleArray[index],('Lights'.'Wattage')); SetField(wattfld,watt); SelField(unitfld); item:=0; REPEAT DialogEvent(item); UNTIL ((item=1) or (item=2)); unit:=GetField(unitfld); SetRField(HandleArray[index],'Lights', 'Unit #', unit); pos:=GetField(posfld); SetRField(HandleArray[index],'Lights', 'Position', pos); cir:=GetField(cirfld); SetRField(HandleArray[index],'Lights', 'Circuit', cir); chan:=GetField(chanfld); SetRField(HandleArray[index],'Lights', 'Channel', chan); color:=GetField(colorfld); SetRField(HandleArray[index],'Lights', 'Color', color); dim:=GetField(dimfld); SetRField(HandleArray[index],'Lights', 'Dimmer', dim); purp:=GetField(purpfld); SetRField(HandleArray[index],'Lights', 'Purpose', purp); temp:=GetField(tempfld); SetRField(HandleArray[index],'Lights', 'Template', temp); misc1:=GetField(misc1fld); SetRField(HandleArray[index],'Lights', 'Miscl#1', misc1); misc2:=GetField(misc2fld); SetRField(HandleArray[index],'Lights', 'Miscl#2', misc2); unittype:=GetField(typefld); SetRField(HandleArray[index],'Lights', 'Type', unittype); watt:=GetField(wattfld); SetRField(HandleArray[index],'Lights', 'Wattage', watt); IF item=2 THEN index:=NumberOfLights End; {FOR index:=1 to NumberOfLights} ClrDialog; End; {Procedure QueryValues} {===================================================} Begin Message('Begin Macro'); PositionStr:=StrDialog('Enter Position Description','PIPE 1'); IF PositionStr<>'' THEN Begin Message('FINDING LIGHTS'); FillArray(PositionStr); RealHolder:=NumberOfLights; StringHolder:=Num2Str(0,RealHolder); Message(Concat('SORTING ',StringHolder,' LIGHTS')); SortArray; Message('Query Values'); QueryValues; ClrMessage; SysBeep; RedrawAll; End; {IF PositionStr<>'' THEN} End; Run(EnterDataForPosition); ny,;An;A y,'`1@ {Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} Procedure SpaceHorizontally; var ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; YArray:array[1..100] of REAL; Space:integer; NewYArray:array[1..100] of REAL; RealX:REAL; RealY:Real; NumberOfLights:integer; Ok:boolean; PositionStr:string; PositionMatch:string; {---------------------------------------------------------} Procedure FillArray; Var index:integer; RealX,RealY:REAL; ok:boolean; messageNum:REAL; messageStr:string; Begin NumberOfLights:=0; LayerHandle:=FLayer; ObjHandle:=FSObject(LayerHandle); WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:=RealX; YArray[NumberOfLights]:=RealY END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} End; {Procedure FillArray} {---------------------------------------------------------} Procedure SortArray; var index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; yHolder:LongInt; noChange:boolean; Begin REPEAT noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO Begin IF XArray[index1]XArray[index2]} End; {FOR index2:=index1+1 to NumberOfLights} {FOR index1:=1 to NumberOfLights-1} UNTIL (noChange); End; {Procedure SortArray} {---------------------------------------------------------} Procedure MoveLights; Var index:integer; deltaX:integer; deltaY:integer; destX:integer; destY:integer; aCode:integer; BEGIN FOR index:=1 to NumberOfLights DO BEGIN destX:=RealX+((index-1)*Space); deltaX:=destX-XArray[index]; HMove(HandleArray[index],deltaX,0); END; {FOR index:=1 to NumberOfLights} END; {Procedure MoveLights} {---------------------------------------------------------} BEGIN {SpaceVertically} Space:=IntDialog('Spacing in inches', '0'); IF Space <> 0 THEN BEGIN Space:=ABS(Space)*(-1); Message('Click on point to align to'); GetPt(RealX,RealY); Message('FINDING LIGHTS'); FillArray; Message('SORTING LIGHTS'); SortArray; Message('MOVING LIGHTS'); MoveLights; ClrMessage; RedrawAll; END; {IF Space <> 0} SysBeep; END; {Procedure SpaceHorizontally} RUN(SpaceHorizontally);n;A y,'`1@ {Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} Procedure SpaceVertically; var ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; YArray:array[1..100] of REAL; Space:integer; NewYArray:array[1..100] of REAL; RealX:REAL; RealY:Real; NumberOfLights:integer; Ok:boolean; PositionStr:string; PositionMatch:string; {---------------------------------------------------------} Procedure FillArray; Var index:integer; RealX,RealY:REAL; ok:boolean; messageNum:REAL; messageStr:string; Begin NumberOfLights:=0; LayerHandle:=FLayer; ObjHandle:=FSObject(LayerHandle); WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:=RealX; YArray[NumberOfLights]:=RealY END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} End; {Procedure FillArray} {---------------------------------------------------------} Procedure SortArray; var index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; yHolder:LongInt; noChange:boolean; Begin REPEAT noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO Begin IF YArray[index1]XArray[index2]} End; {FOR index2:=index1+1 to NumberOfLights} {FOR index1:=1 to NumberOfLights-1} UNTIL (noChange); End; {Procedure SortArray} {---------------------------------------------------------} Procedure MoveLights; Var index:integer; deltaY:integer; destX:integer; destY:integer; aCode:integer; BEGIN Space:=IntDialog('Spacing in inches', '0'); IF Space <> 0 THEN BEGIN Space:=ABS(Space)*(-1); Message('Click on point to align to'); GetPt(RealX,RealY); FOR index:=1 to NumberOfLights DO BEGIN destY:=RealY+((index-1)*Space); deltaY:=destY-YArray[index]; HMove(HandleArray[index],0,deltaY); END; {FOR index:=1 to NumberOfLights} END; {IF Space <> 0} End; {Procedure MoveLights} {---------------------------------------------------------} BEGIN {SpaceVertically} Message('FINDING LIGHTS'); FillArray; Message('SORTING LIGHTS'); SortArray; Message('MOVING LIGHTS'); MoveLights; ClrMessage; RedrawAll; SysBeep; END; {Procedure SpaceVertically} RUN(SpaceVertically);ny,;Any,;An;Ay,'`1@w{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This Procedure DELETES any light whose position field has a string length less than 2. This is mainly usefull for getting rid of artifacts that might be in your plot from the legend or similar operations} Procedure DeleteUpositioned; Var ObjHandle:Handle; LayerHandle:Handle; index:integer; RealX,RealY:REAL; NumberOfLights:integer; PositionStr:String; HandleArray:array[1..100] of Handle; BEGIN PositionStr:='Are you SURE you want to do this DANGEROUS thing'; IF YNDialog(PositionStr) THEN BEGIN Message('Deleting Unpositioned Lights'); FOR index := 1 to 100 DO HandleArray[index] := NIL; NumberOfLights:=0; LayerHandle:=FLayer; WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FInLayer(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF ((GetType(ObjHandle)=15) AND (GetRecord(ObjHandle,1)<>NIL)) THEN BEGIN PositionStr:=EvalStr(ObjHandle,('Lights'.'Position')); IF LEN(PositionStr) < 2 THEN BEGIN NumberOfLights := NumberOfLights + 1; HandleArray[NumberOfLights]:=ObjHandle; END; {IF LEN(PositionStr) < 2} END; {IF GetType(ObjHandle)=15} ObjHandle:=NextObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} index := 1; WHILE ((index<101) and (HandleArray[index] <> NIL)) DO BEGIN DelObject( HandleArray[index]); index := index + 1; END; {WHILE HandleArray[index] <> nil} Redraw; ClrMessage; END; {IF YNDialog(PositionStr)} END; {Procedure DeleteUpositioned} RUN(DeleteUpositioned);ny,;Any,;An;Ay,'`1@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This Procedure will number the selected units from stage left in groups. i.e. 1.1, 1.2, 1.3, 1.4, 2.1, 2.2, 2.3, 2.4} {IMPORTANT....The selected units MUST BE IN THE ACTIVE LAYER} {This routine does not allow the use of "0" as a starting position value. This is so that the cancel button will cancel. (Cancel returns the default value)} Procedure Number4CirStrips; var ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; NumberOfLights:integer; UnitNumber:integer; Ok:boolean; PositionStr:string; PositionMatch:string; {---------------------------------------------------------} Procedure GetObjectPosition(var theObject:Handle); Var positStr:string; object:Handle; Begin PositionStr:=EvalStr(theObject,('Lights'.'Position')); Ok:=YNDialog(Concat('Position is ',PositionStr)); IF (not ok) THEN theObject:=NIL ELSE UnitNumber:=IntDialog('Start at what number', '0'); End; {Procedure GetObjectPosition} {---------------------------------------------------------} Procedure FillArray(positionOk:boolean); Var index:integer; RealX,RealY:REAL; ok:boolean; messageNum:REAL; messageStr:string; Begin NumberOfLights:=0; ObjHandle:=FSActLayer; WHILE ((GetType(ObjHandle)<>15) AND (ObjHandle<>NIL) AND (GetRecord(ObjHandle,1)=NIL)) DO ObjHandle:=NextSObj(ObjHandle); GetObjectPosition(ObjHandle); IF ObjHandle<>NIL THEN BEGIN positionOk:=True; LayerHandle:=FLayer; ObjHandle:=FSObject(LayerHandle); WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch:=EvalStr(ObjHandle,('Lights'.'Position' = PositionStr)); IF PositionMatch='True' THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:=RealX; END; {IF PositionMatch='True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END {IF ObjHandle<>NIL} ELSE positionOk:=False; End; {Procedure FillArray} {---------------------------------------------------------} Procedure SortArray; var index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; noChange:boolean; Begin REPEAT noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO Begin IF XArray[index1]XArray[index2]} End; {FOR index2:=index1+1 to NumberOfLights} {FOR index1:=1 to NumberOfLights-1} UNTIL (noChange); End; {Procedure SortArray} {---------------------------------------------------------} Procedure AssignPositionValues; Var index:integer; isStrip:integer; realIndex:REAL; fraction:REAL; stringHolder:string; handleHolder:Handle; keyThing:integer; thing:boolean; Begin fraction:=0; IF UnitNumber <> 0 THEN BEGIN UnitNumber:=UnitNumber-1; fraction:=0.4; FOR index:=1 to NumberOfLights DO Begin ObjHandle:=HandleArray[index]; stringHolder:=GetSymName(ObjHandle); isStrip:=Pos('FAR CYC', stringHolder); IF isStrip=0 THEN isStrip:=Pos('STRIP', stringHolder); IF isStrip>0 THEN BEGIN fraction:=fraction+0.1; IF fraction>0.4 THEN BEGIN fraction:=0.1; UnitNumber:=UnitNumber+1; END; realIndex:=UnitNumber + fraction; stringHolder:=Num2Str(1,realIndex); END {IF isStrip>0} ELSE BEGIN UnitNumber:=UnitNumber+1; stringHolder:=Num2Str(0,UnitNumber); END; SetRField(HandleArray[index],'Lights','Unit #',stringHolder); End; {FOR index:=1 to NumberOfLights} END; End; {Procedure AssignPositionValues} {---------------------------------------------------------} begin Message('FINDING LIGHTS'); FillArray(Ok); IF Ok THEN BEGIN Message('SORTING LIGHTS'); SortArray; Message('ASSIGNING NUMBERS'); AssignPositionValues; END; ClrMessage; RedrawAll; SysBeep; end; {Procedure Number4CirStrips;} Run(Number4CirStrips); n;Ay,'`1@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This Procedure will number the selected units from stage left in groups. i.e. 1.1, 1.2, 1.3, 2.1, 2.2, 2.3} {IMPORTANT....The selected units MUST BE IN THE ACTIVE LAYER} {This routine does not allow the use of "0" as a starting position value. This is so that the cancel button will cancel. (Cancel returns the default value)} Procedure Number3CirStrips; var ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; NumberOfLights:integer; UnitNumber:integer; Ok:boolean; PositionStr:string; PositionMatch:string; {---------------------------------------------------------} Procedure GetObjectPosition(var theObject:Handle); Var positStr:string; object:Handle; Begin PositionStr:=EvalStr(theObject,('Lights'.'Position')); Ok:=YNDialog(Concat('Position is ',PositionStr)); IF (not ok) THEN theObject:=NIL ELSE UnitNumber:=IntDialog('Start at what number', '0'); End; {Procedure GetObjectPosition} {---------------------------------------------------------} Procedure FillArray(positionOk:boolean); Var index:integer; RealX,RealY:REAL; ok:boolean; messageNum:REAL; messageStr:string; Begin NumberOfLights:=0; ObjHandle:=FSActLayer; WHILE ((GetType(ObjHandle)<>15) AND (ObjHandle<>NIL) AND (GetRecord(ObjHandle,1)=NIL)) DO ObjHandle:=NextSObj(ObjHandle); GetObjectPosition(ObjHandle); IF ObjHandle<>NIL THEN BEGIN positionOk:=True; LayerHandle:=FLayer; ObjHandle:=FSObject(LayerHandle); WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch:=EvalStr(ObjHandle,('Lights'.'Position' = PositionStr)); IF PositionMatch='True' THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:=RealX; END; {IF PositionMatch='True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END {IF ObjHandle<>NIL} ELSE positionOk:=False; End; {Procedure FillArray} {---------------------------------------------------------} Procedure SortArray; var index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; noChange:boolean; Begin REPEAT noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO Begin IF XArray[index1]XArray[index2]} End; {FOR index2:=index1+1 to NumberOfLights} {FOR index1:=1 to NumberOfLights-1} UNTIL (noChange); End; {Procedure SortArray} {---------------------------------------------------------} Procedure AssignPositionValues; Var index:integer; isStrip:integer; realIndex:REAL; fraction:REAL; stringHolder:string; handleHolder:Handle; keyThing:integer; thing:boolean; Begin fraction:=0; IF UnitNumber <> 0 THEN BEGIN UnitNumber:=UnitNumber-1; fraction:=0.3; FOR index:=1 to NumberOfLights DO Begin ObjHandle:=HandleArray[index]; stringHolder:=GetSymName(ObjHandle); isStrip:=Pos('FAR CYC', stringHolder); IF isStrip=0 THEN isStrip:=Pos('STRIP', stringHolder); IF isStrip>0 THEN BEGIN fraction:=fraction+0.1; IF fraction>0.3 THEN BEGIN fraction:=0.1; UnitNumber:=UnitNumber+1; END; realIndex:=UnitNumber + fraction; stringHolder:=Num2Str(1,realIndex); END {IF isStrip>0} ELSE BEGIN UnitNumber:=UnitNumber+1; stringHolder:=Num2Str(0,UnitNumber); END; SetRField(HandleArray[index],'Lights','Unit #',stringHolder); End; {FOR index:=1 to NumberOfLights} END; End; {Procedure AssignPositionValues} {---------------------------------------------------------} begin Message('FINDING LIGHTS'); FillArray(Ok); IF Ok THEN BEGIN Message('SORTING LIGHTS'); SortArray; Message('ASSIGNING NUMBERS'); AssignPositionValues; END; ClrMessage; RedrawAll; SysBeep; end; {Procedure Number3CirStrips;} Run(Number3CirStrips); ny,;Any,;An;ATy,'`1@.{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This macro will align selected lighting units vertically according to their insertion points} Procedure AlignLightsLR; var ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; RealX, RealY:REAL; ObjX, ObjY:REAL; DX:REAL; Begin Message('Click on point to align to'); GetPt(RealX,RealY); LayerHandle:=FLayer; WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN GetSymLoc(ObjHandle,ObjX,ObjY); DX:=RealX-ObjX; Hmove(ObjHandle,DX,0) END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} ClrMessage; End; {Procedure AlignVertically} {---------------------------------------------------------} Run(AlignLightsLR);ny,;Any,;An;ATy,'`(1@.{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This macro will align selected lighting units horizontally according to their insertion points} Procedure AlignLightsTB; var ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; RealX, RealY:REAL; ObjX, ObjY:REAL; DY:REAL; Begin Message('Click on point to align to'); GetPt(RealX,RealY); LayerHandle:=FLayer; WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN GetSymLoc(ObjHandle,ObjX,ObjY); DY:=RealY-ObjY; Hmove(ObjHandle,0,DY) END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} ClrMessage; End; {Procedure AlignLightsTB} {---------------------------------------------------------} Run(AlignLightsTB);ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;Ay,'`t1@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This Procedure will number the selected units from stage right} {This routine does not allow the use of "0" as a starting position value. This is so that the cancel button will cancel. (Cancel returns the default value)} Procedure NumberSelectedFromSR; var ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; NumberOfLights:integer; UnitNumber:integer; Ok:boolean; PositionStr:string; PositionMatch:string; {---------------------------------------------------------} Procedure GetObjectPosition(var theObject:Handle); Var positStr:string; object:Handle; Begin PositionStr:=EvalStr(theObject,('Lights'.'Position')); Ok:=YNDialog(Concat('Position is ',PositionStr)); IF (not ok) THEN theObject:=NIL ELSE UnitNumber:=IntDialog('Start at what number', '0'); End; {Procedure GetObjectPosition} {---------------------------------------------------------} Procedure FillArray(positionOk:boolean); Var index:integer; RealX,RealY:REAL; ok:boolean; messageNum:REAL; messageStr:string; Begin NumberOfLights:=0; ObjHandle:=FSActLayer; WHILE ((GetType(ObjHandle)<>15) AND (ObjHandle<>NIL) AND (GetRecord(ObjHandle,1)=NIL)) DO ObjHandle:=NextSObj(ObjHandle); GetObjectPosition(ObjHandle); IF ObjHandle<>NIL THEN BEGIN positionOk:=True; LayerHandle:=FLayer; ObjHandle:=FSObject(LayerHandle); WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch:=EvalStr(ObjHandle,('Lights'.'Position' = PositionStr)); IF PositionMatch='True' THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:=RealX; END; {IF PositionMatch='True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END {IF ObjHandle<>NIL} ELSE positionOk:=False; End; {Procedure FillArray} {---------------------------------------------------------} Procedure SortArray; var index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; noChange:boolean; Begin REPEAT noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO Begin IF XArray[index1]>XArray[index2] THEN Begin objectHolder:=HandleArray[index2]; xHolder:=XArray[index2]; HandleArray[index2]:=HandleArray[index1]; XArray[index2]:=XArray[index1]; HandleArray[index1]:=objectHolder; XArray[index1]:=xHolder; NoChange:=False; End; {IF XArray[index1]>XArray[index2]} End; {FOR index2:=index1+1 to NumberOfLights} {FOR index1:=1 to NumberOfLights-1} UNTIL (noChange); End; {Procedure SortArray} {---------------------------------------------------------} Procedure AssignPositionValues; Var index:integer; realIndex:REAL; stringHolder:string; handleHolder:Handle; Begin IF UnitNumber<>0 THEN FOR index:=1 to NumberOfLights DO Begin realIndex:=(UnitNumber+index-1); stringHolder:=Num2Str(0,realIndex); SetRField(HandleArray[index],'Lights','Unit #',stringHolder); End; {FOR index:=1 to NumberOfLights} End; {Procedure AssignPositionValues} {---------------------------------------------------------} begin Message('FINDING LIGHTS'); FillArray(Ok); IF Ok THEN BEGIN Message('SORTING LIGHTS'); SortArray; Message('ASSIGNING NUMBERS'); AssignPositionValues; END; ClrMessage; RedrawAll; SysBeep; end; {Procedure NumberSelectedFromSR} Run(NumberSelectedFromSR); n;Aey,'`p1@?{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} Procedure NumberSRBoom; var ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; YArray:array[1..100] of REAL; NumberOfLights:integer; Ok:boolean; PositionStr:string; PositionMatch:string; {---------------------------------------------------------} Procedure GetObjectPosition(var theObject:Handle); Var positStr:string; object:Handle; Begin PositionStr:=EvalStr(theObject,('Lights'.'Position')); Ok:=YNDialog(Concat('Position is ',PositionStr)); IF (not ok) THEN Begin theObject:=NIL; End; End; {Procedure GetObjectPosition} {---------------------------------------------------------} Procedure FillArray(var positionOk:boolean); Var index:integer; RealX,RealY:REAL; ok:boolean; messageNum:REAL; messageStr:string; Begin NumberOfLights:=0; ObjHandle:=FSActLayer; WHILE ((GetType(ObjHandle)<>15) AND (ObjHandle<>NIL) AND (GetRecord(ObjHandle,1)=NIL)) DO ObjHandle:=NextSObj(ObjHandle); GetObjectPosition(ObjHandle); IF ObjHandle<>NIL THEN BEGIN positionOk:=True; LayerHandle:=FLayer; ObjHandle:=FSObject(LayerHandle); WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch:=EvalStr(ObjHandle,('Lights'.'Position' = PositionStr)); IF PositionMatch='True' THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:=RealX; YArray[NumberOfLights]:=RealY; END; {IF PositionMatch='True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END {IF ObjHandle<>NIL} ELSE positionOk:=False; End; {Procedure FillArray} {---------------------------------------------------------} Procedure SortArray; var index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; yHolder:LongInt; noChange:boolean; Begin noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO BEGIN Message(concat('index1=',Num2Str(0,index1), 'index2=',Num2Str(0,index2))); IF (YArray[index1]15) AND (ObjHandle<>NIL) AND (GetRecord(ObjHandle,1)=NIL)) DO ObjHandle:=NextSObj(ObjHandle); GetObjectPosition(ObjHandle); IF ObjHandle<>NIL THEN BEGIN positionOk:=True; LayerHandle:=FLayer; ObjHandle:=FSObject(LayerHandle); WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch:=EvalStr(ObjHandle,('Lights'.'Position' = PositionStr)); IF PositionMatch='True' THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:=RealX; YArray[NumberOfLights]:=RealY; END; {IF PositionMatch='True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END {IF ObjHandle<>NIL} ELSE positionOk:=False; End; {Procedure FillArray} {---------------------------------------------------------} Procedure SortArray; var index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; yHolder:LongInt; noChange:boolean; Begin noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO BEGIN Message(concat('index1=',Num2Str(0,index1), 'index2=',Num2Str(0,index2))); IF (YArray[index1]NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN FillStrings; Message(OutputStr); WriteOutput; ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} Close(ExportFile); ClrMessage; DSelectAll; END; {IF NOT DidCancel} SysBeep; SysBeep; SysBeep; END; {PROCEDURE WriteData} Run(WriteData); ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;A(y,'`1@(b{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This macro reads data from a text file and inserts the data into the data base. The data must be in the Data Window order and the macro must find a Unit# and Position match. The Data should be in the same order as the objects in the drawing. See Auto Draft Instr.} PROCEDURE ReadFile; CONST Backward=1; Forward=2; VAR ImportFile:Text; SymbolConflictFile:Text; MissingSymbolsFile:Text; FileName:STRING; InstrumentArray:array[1..1000] of Handle; LinkArray:array[0..1001,1..2] of integer; ObjHandle:Handle; LayerHandle:Handle; NumberOfLights:integer; RealNumber:Real; Index:integer; LinkErrorCount:integer; TypeErrorCount:integer; TypeConflict:array[1..20,1..3] of string; BadLinkTable:array[1..20,1..3] of string; unitStr,posStr,typeStr,wattStr,cirStr,chanStr,colorStr:STRING; funStr,tempStr,dimStr,shortStr,miscl1Str,miscl2Str:STRING; Key:integer; PROCEDURE FillHandleArray; VAR unitHolder:string; BEGIN NumberOfLights:=0; LayerHandle:=FLayer; LinkArray[0,Backward]:=0; LinkArray[0,Forward]:=1; WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FInLayer(LayerHandle); WHILE ObjHandle<>NIL Do BEGIN IF NumRecords(ObjHandle)>0 THEN BEGIN unitHolder:=EvalStr(ObjHandle, ('Lights'.'Unit #')); IF unitHolder>'0' THEN BEGIN NumberOfLights:=NumberOfLights+1; Message(concat('NumberOfLights = ', Num2Str(0,NumberOfLights))); InstrumentArray[NumberOfLights]:=ObjHandle; LinkArray[NumberOfLights,Backward]:=NumberOfLights-1; LinkArray[NumberOfLights,Forward]:=NumberOfLights+1; END; {IF unitHolder>'0'} END; {IF NumRecords(ObjHandle)>0} ObjHandle:=NextObj(ObjHandle); END;{While ObjHandle<>nil} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END; {Procedure FillHandleArray} {------------------------------------------------------------} PROCEDURE MakDlog; var item:integer; x1,x2,y1,y2:integer; BEGIN item:=1; BeginDialog(1,1,13,29,497,333); AddButton('OK',1,1,376,8,444,28); x1:=18; x2:=204; FOR item:= 2 TO 11 DO BEGIN y1:=((item-2)*24)+60; y2:=y1+16; AddField('',item,1,x1,y1,x2,y2); END; x1:=212; x2:=342; FOR item:= 12 TO 21 DO BEGIN y1:=((item-12)*24)+60; y2:=y1+16; AddField('',item,1,x1,y1,x2,y2); END; x1:=350; x2:=480; FOR item:= 22 TO 31 DO BEGIN y1:=((item-22)*24)+60; y2:=y1+16; AddField('',item,1,x1,y1,x2,y2); END; AddField('Position & Unit',32,1,18,36,146,52); AddField('Hook up type',33,1,212,36,342,52); AddField('Plot Symbol type',34,1,350,36,480,52); AddField('These units have conflicting type descriptions',35,1,16,8,324,28); EndDialog; END; {Procedure MakDlog} {------------------------------------------------------------} PROCEDURE MakDlog2; var item:integer; x1,x2,y1,y2:integer; BEGIN item:=1; BeginDialog(2,1,13,29,497,333); AddButton('OK',1,1,376,8,444,28); x1:=18; x2:=204; FOR item:= 2 TO 11 DO BEGIN y1:=((item-2)*24)+60; y2:=y1+16; AddField('',item,1,x1,y1,x2,y2); END; x1:=212; x2:=342; FOR item:= 12 TO 21 DO BEGIN y1:=((item-12)*24)+60; y2:=y1+16; AddField('',item,1,x1,y1,x2,y2); END; x1:=350; x2:=480; FOR item:= 22 TO 31 DO BEGIN y1:=((item-22)*24)+60; y2:=y1+16; AddField('',item,1,x1,y1,x2,y2); END; AddField('Unit#',32,1,18,36,146,52); AddField('Position',33,1,212,36,342,52); AddField('Channel',34,1,350,36,480,52); AddField('These units in the Hookup are NOT on the Plot',35,1,16,8,324,28); EndDialog; END; {Procedure MakDlog2} {------------------------------------------------------------} PROCEDURE FillDataFields(index:integer); VAR plotType:STRING; alertStr:STRING; BEGIN SetRField(InstrumentArray[index],'Lights','Unit #',unitStr); SetRField(InstrumentArray[index], 'Lights','Position',posStr); plotType:=GetSymName(InstrumentArray[index]); IF (Pos(typeStr,plotType)>0) THEN SetRField(InstrumentArray[index],'Lights','Type',typeStr) ELSE BEGIN TypeErrorCount:=TypeErrorCount+1; IF TypeErrorCount<21 THEN BEGIN TypeConflict[TypeErrorCount,1]:=concat(posStr,' #',unitStr); TypeConflict[TypeErrorCount,2]:=typeStr; TypeConflict[TypeErrorCount,3]:=plotType; END ELSE TypeConflict[20,2]:='MORE THAN 20'; END; {ELSE} SetRField(InstrumentArray[index], 'Lights','Wattage',wattStr); SetRField(InstrumentArray[index], 'Lights','Circuit',cirStr); SetRField(InstrumentArray[index], 'Lights','Channel',chanStr); SetRField(InstrumentArray[index], 'Lights','Color',colorStr); SetRField(InstrumentArray[index], 'Lights','Purpose',funStr); SetRField(InstrumentArray[index], 'Lights','Template',tempStr); SetRField(InstrumentArray[index],'Lights','Dimmer',dimStr); SetRField(InstrumentArray[index],'Lights','Short Purp',shortStr); SetRField(InstrumentArray[index],'Lights','Miscl#1',miscl1Str); SetRField(InstrumentArray[index],'Lights','Miscl#2',miscl2Str); LinkArray[LinkArray[index,Backward],Forward]:= LinkArray[index,Forward]; LinkArray[LinkArray[index,Forward],Backward]:= LinkArray[index,Backward]; END; {PROCEDURE FillDataField} {------------------------------------------------------------} Procedure GetInfo; Var index,index2:integer; unitHolder,posHolder:STRING; numberLeft:REAL; count:integer; plotType:STRING; msgStr:STRING; key:integer; Begin index:=0; count:=0; While NOT EOF(ImportFile) DO Begin index:=index+1; count:=count+1; Readln(unitStr); Readln(posStr); Readln(typeStr); Readln(wattStr); Readln(cirStr); Readln(chanStr); Readln(colorStr); Readln(funStr); Readln(tempStr); Readln(dimStr); Readln(shortStr); Readln(miscl1Str); Readln(miscl2Str); IF LinkArray[0,Forward] = 0 THEN BEGIN Message('Forward = 0'); SysBeep; SysBeep; SysBeep; GetKeyDown(key); END; Index:=LinkArray[0,Forward]; unitHolder:=EvalStr(InstrumentArray[index], ('Lights'.'Unit #')); posHolder:=EvalStr(InstrumentArray[index], ('Lights'.'Position')); Message(concat('(',Num2Str(0,Count),') #',unitHolder,' ',posHolder)); IF ((unitHolder=unitStr) and (posHolder=posStr)) THEN FillDataFields(index) ELSE BEGIN REPEAT IF LinkArray[0,Forward] = 0 THEN BEGIN Message('Forward = 0'); SysBeep; SysBeep; SysBeep; GetKeyDown(key); END; Index:=LinkArray[Index,Forward]; unitHolder:=EvalStr(InstrumentArray[index], ('Lights'.'Unit #')); posHolder:=EvalStr(InstrumentArray[index], ('Lights'.'Position')); UNTIL (((unitHolder=unitStr) and (posHolder=posStr)) OR (Index=NumberOfLights)); IF ((unitHolder=unitStr) and (posHolder=posStr)) THEN FillDataFields(index) ELSE BEGIN LinkErrorCount:=LinkErrorCount+1; IF LinkErrorCount<20 THEN BEGIN BadLinkTable[LinkErrorCount,1]:=unitStr; BadLinkTable[LinkErrorCount,2]:=posStr; BadLinkTable[LinkErrorCount,3]:=chanStr; END ELSE BadLinkTable[LinkErrorCount,2]:='MORE THAN 20'; END; {ELSE} END; {ELSE} END; {While EOF(ImportFile) DO} Close(ImportFile); Message('End File Read'); IF TypeConflict[1,1]<>'' THEN BEGIN Message('Before MakDlog'); MakDlog; GetDialog(1); FOR Index:= 2 to 11 DO BEGIN SetField(index,TypeConflict[Index-1,1]); SetField(index+10,TypeConflict[Index-1,2]); SetField(index+20,TypeConflict[Index-1,3]); IF TypeConflict[Index-1,1]='' THEN Index:=11; END;{FOR Index:= 2 to 11} REPEAT DialogEvent(Index); UNTIL (Index=1); ClrDialog; SymbolConflictFile:='Symbol Conflicts'; PutFile('SAVE Symbol Conflicts File', 'Symbol Conflicts', SymbolConflictFile); IF NOT DidCancel THEN BEGIN Write('Position & Unit#'); Tab(1); Write('Hookup Type'); Tab(1); Writeln('Plot Symbol Type'); FOR Index:=1 to 20 DO BEGIN Write(TypeConflict[Index,1]); Tab(1); Write(TypeConflict[Index,2]); Tab(1); Writeln(TypeConflict[Index,3]); END;{FOR Index:=1 to 20} Close(SymbolConflictFile); END; {IF NOT DidCancel} END; {IF TypeConflict[1,1]<>''} IF BadLinkTable[1,1]<>'' THEN BEGIN Message('Before MakDlog'); MakDlog2; GetDialog(2); FOR Index:= 2 to 11 DO BEGIN SetField(index,BadLinkTable[Index-1,1]); SetField(index+10,BadLinkTable[Index-1,2]); SetField(index+20,BadLinkTable[Index-1,3]); IF BadLinkTable[Index-1,1]='' THEN Index:=11; END;{FOR Index:= 2 to 11} REPEAT DialogEvent(Index); UNTIL (Index=1); ClrDialog; MissingSymbolsFile:='Missing Symbols'; PutFile('SAVE Missing Symbols File', 'Missing Symbols', MissingSymbolsFile); IF NOT DidCancel THEN BEGIN Write('Unit#'); Tab(1); Write('Position'); Tab(1); Writeln('Channel'); FOR Index:=1 to 20 DO BEGIN Write(BadLinkTable[Index,1]); Tab(1); Write(BadLinkTable[Index,2]); Tab(1); Writeln(BadLinkTable[Index,3]); END;{FOR Index:=1 to 20} Close(MissingSymbolsFile); END; {IF NOT DidCancel} END; {IF BadLinkTable[1,1]<>''} End; {Procedure ReadFile} {------------------------------------------------------------} BEGIN Message('Retrieving File'); GetFile(ImportFile); Message('INITIALIZING ARRAYS'); IF NOT DidCancel THEN BEGIN FOR Index:=1 to 1000 DO BEGIN Message(Num2Str(0,index)); InstrumentArray[Index]:=nil; LinkArray[Index,1]:=0; LinkArray[Index,2]:=0; END; {FOR Index:=1 to 1000} FOR Index:=1 to 20 DO BEGIN BadLinkTable[Index,1]:=''; BadLinkTable[Index,2]:=''; BadLinkTable[Index,3]:=''; TypeConflict[Index,1]:=''; TypeConflict[Index,2]:=''; TypeConflict[Index,3]:=''; END; LinkErrorCount:=0; TypeErrorCount:=0; Message('FINDING LIGHTS'); FillHandleArray; Message('READING FILE'); GetInfo; ClrMessage; RedrawAll; END; {IF NOT DidCancel} End; {PROCEDURE ReadFile} Run(ReadFile); ny,;An;A y,'`1@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This Procedure will number the selected units from stage left} {This routine does not allow the use of "0" as a starting position value. This is so that the cancel button will cancel. (Cancel returns the default value)} Procedure NumberSelectedUnits; var ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; NumberOfLights:integer; UnitNumber:integer; Ok:boolean; PositionStr:string; PositionMatch:string; {---------------------------------------------------------} Procedure GetObjectPosition(var theObject:Handle); Var positStr:string; object:Handle; Begin PositionStr:=EvalStr(theObject,('Lights'.'Position')); Ok:=YNDialog(Concat('Position is ',PositionStr)); IF (not ok) THEN theObject:=NIL ELSE UnitNumber:=IntDialog('Start at what number', '0'); End; {Procedure GetObjectPosition} {---------------------------------------------------------} Procedure FillArray(positionOk:boolean); Var index:integer; RealX,RealY:REAL; ok:boolean; messageNum:REAL; messageStr:string; Begin NumberOfLights:=0; ObjHandle:=FSActLayer; WHILE ((GetType(ObjHandle)<>15) AND (ObjHandle<>NIL) AND (GetRecord(ObjHandle,1)=NIL)) DO ObjHandle:=NextSObj(ObjHandle); GetObjectPosition(ObjHandle); IF ObjHandle<>NIL THEN BEGIN positionOk:=True; LayerHandle:=FLayer; ObjHandle:=FSObject(LayerHandle); WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch:=EvalStr(ObjHandle,('Lights'.'Position' = PositionStr)); IF PositionMatch='True' THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:=RealX; END; {IF PositionMatch='True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END {IF ObjHandle<>NIL} ELSE positionOk:=False; End; {Procedure FillArray} {---------------------------------------------------------} Procedure SortArray; var index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; noChange:boolean; Begin REPEAT noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO Begin IF XArray[index1]XArray[index2]} End; {FOR index2:=index1+1 to NumberOfLights} {FOR index1:=1 to NumberOfLights-1} UNTIL (noChange); End; {Procedure SortArray} {---------------------------------------------------------} Procedure AssignPositionValues; Var index:integer; realIndex:REAL; stringHolder:string; handleHolder:Handle; Begin IF UnitNumber <> 0 THEN FOR index:=1 to NumberOfLights DO Begin realIndex:=(UnitNumber+index-1); stringHolder:=Num2Str(0,realIndex); SetRField(HandleArray[index],'Lights','Unit #',stringHolder); End; {FOR index:=1 to NumberOfLights} End; {Procedure AssignPositionValues} {---------------------------------------------------------} begin Message('FINDING LIGHTS'); FillArray(Ok); IF Ok THEN BEGIN Message('SORTING LIGHTS'); SortArray; Message('ASSIGNING NUMBERS'); AssignPositionValues; END; ClrMessage; RedrawAll; SysBeep; end; {Procedure NumberSelectedUnits} Run(NumberSelectedUnits); ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;A y,'`01@ k{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This macro allows you to enter a position description and then it finds all the lights with that position description, sorts them by their X coordinate and then numbers them from stage left. THIS IS SLOWER than using the Number Selected macro because it will examine all the instruments in the drawing to see if they have the specified position description.} Procedure NumberUnitsAtPosition; var ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; NumberOfLights:integer; Ok:boolean; PositionStr:string; PositionMatch:string; {---------------------------------------------------------} Procedure FillArray(positionStr:string); Var index:integer; RealX,RealY:REAL; Begin NumberOfLights:=0; LayerHandle:=FLayer; WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FInLayer(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch:=EvalStr(ObjHandle,('Lights'.'Position' = positionStr)); IF PositionMatch='True' THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:=RealX; END; {IF PositionMatch='True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHanel<>NIL} End; {Procedure FillArray} {---------------------------------------------------------} Procedure SortArray; var index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; noChange:boolean; Begin REPEAT noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO Begin IF XArray[index1]XArray[index2]} End; {FOR index2:=index1+1 to NumberOfLights} {FOR index1:=1 to NumberOfLights-1} UNTIL (noChange); End; {Procedure SortArray} {---------------------------------------------------------} Procedure AssignPositionValues; Var index:integer; realIndex:REAL; stringHolder:string; handleHolder:Handle; Begin FOR index:=1 to NumberOfLights DO Begin realIndex:=index; stringHolder:=Num2Str(0,realIndex); SetRField(HandleArray[index],'Lights','Unit #',stringHolder); End; {FOR index:=1 to NumberOfLights} End; {Procedure AssignPositionValues} {---------------------------------------------------------} begin {NumberUnitsAtPosition} PositionStr:=StrDialog('Enter Position Description',''); IF PositionStr<>'' THEN Begin Message('FINDING LIGHTS'); FillArray(PositionStr); Message('SORTING LIGHTS'); SortArray; Message('ASSIGNING NUMBERS'); AssignPositionValues; ClrMessage; RedrawAll; SysBeep; End; {IF PositionStr<>''} end; {Procedure NumberUnitsAtPosition} Run(NumberUnitsAtPosition);n;Ay,'`81@u{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This Macro duplicates the function of entering a new position in the} {in the Data window, but it does it more slowly. Oh well.} Procedure EnterPositionOfSelected; var ObjHandle:Handle; LayerHandle:Handle; Ok:boolean; StringHolder:string; PositionStr:string; begin LayerHandle:=FLayer; ObjHandle:=FSObject(LayerHandle); StringHolder:=EvalStr(ObjHandle, ('Lights'.'Position')); PositionStr:=StrDialog('Enter Position Description',''); IF PositionStr<>'' THEN BEGIN WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF ((GetType(ObjHandle)=15) AND (GetRecord(ObjHandle,1)<>NIL)) THEN SetRField(ObjHandle,'Lights','Position',PositionStr); ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} End {IF PositionStr<>''} ELSE SetRField(ObjHandle,'Lights','Position',StringHolder); SysBeep; end; {Procedure EnterPositionOfSelected} Run(EnterPositionOfSelected); ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;A$y,'`p/VAUnit # M:à mChannel M:à ColorC M: TemplateC0Dimmert8HC<0AVNCTy,3>@JlJ#j'`x'`Fy,1@ DSelectAll; SelectObj((T=Line));Uy,1@/DSelectAll; SelectObj(('Info'.'Channel' > 70));my,1@GDSelectAll; SelectObj(('Info'.'Channel' > 10)&('Info'.'Channel' < 20));Ry,1@,SelectObj((L='Units') & (C='1ST ELECTRIC'));>y,1@SelectObj((S='Circle'));?y,1@SelectObj((S='dimmer '));$y,'`/=A Unit # 7 Chan. 1 7 Chan. 27 7 Chan. 377Chan. 4S77Color 1J77Color 2 7Color 37@  Color 4 7@ $Dim.1 7@ (Dim.2,Dim.3 @0Dim.4 @ Z0A=4444444444444y,'`iQGG  `HHHHCreate Workmt$>XnL````` ```@`  Unit # Channel Color Template  $Position3 $Type %N a[VInfoAe @hVInfoUnit #e @kVInfoChannele @j@VInfoColore @MVInfo Templatee @k@ @k@  y,pAdtWorkme atdxCreate Workmtm@" 6Jmm6677779999Iy,'`<%A"04:@DN\`flpz    * 8 < B H L V d h n t x !! !!!*!0!6!<!@!N!\!b!h!n!r!!!!!!!!!!!!!!!!""""""&","2"6"F"T"X"^"d"h"x"""""""""""""""""##"#&#,#0#4#J#X#\#b#h#l##############$$$ $$$*$0$6$<$@$N$\$b$h$n$r$$$$$$$$$$$$$$$$%%%%$%*%0%6%:%H%V%Z%`%d%h%v%%%%%%%%%%%%%%%%%& &&&"&(&,&:&H&L&R&X&\&j&x&|&&&&&&&&&&&&&&&&'' ''''0'>'B'H'N'R'f't'x'~'''''''''''''''((((((&(4(8(>(D(H(V(d(h(n(t(x((((((((((((())) )))*)8)<)B)H)L)b)p)t)z))))))))))))))* ***"*(*,*B*P*T*Z*`*d*r*****************+++++ +$+2+@+F+L+R+V+d+r+x+~+++++++++++++++,, ,,,,*,8,>,D,J,N,\,j,n,t,z,~,,,,,,,,,,,,,,--- ---,-2-8->-B-P-^-b-h-n-r----------------.... .&.,.2.6.H.R.X.^.d.h.z.................////"/(/,/>/H/L/R/X/\/n/x/|////////////////0 00000,0:0>0D0H0L0Z0h0l0r0x0|00000000000000111 11 1.141:1@1D1R1`1d1j1p1t111111111111111112222 2&2,202>2L2P2V2\2`2n2|2222222222222222233 3333*383>3D3J3N3X3f3j3p3v3z33333333333333334444&4*40464:4J4X4\4b4h4l4z4444444444444445555*5.52585<5J5\5`5d5j5n5|5555555555555556666$6(6,62666D6V6Z6^6d6h6v666666666666666667 77"7&7,707>7P7T7X7^7b7p77777777777777778888"8(8.828F8T8Z8`8f8j8x888888888888888889 99 9&9,909>9L9P9V9\9`9n9|9999999999999999::: :&:,:0:F:T:X:^:d:h:~:::::::::::::;;; ;;&;4;8;>;D;H;^;l;p;v;|;;;;;;;;;;;;;;;<< <<<"<0<6<<>>>">&>,>2>6>H>R>V>\>b>f>x>>>>>>>>>>>>>>>>>? ???$?*?.?@?J?P?V?\?`?r?|????????????????@@@@@$@(@6@D@H@N@T@X@f@t@x@~@@@@@@@@@@@@@@@AA AAAA,A:A>ADAJANA^AlApAvA|AAAAAAAAAAAAAAAAABBBBB B&B,B0B:BHBLBRBXB\BfBtBxB~BBBBBBBBBBBBBBBCCC CCC&C8C<CBCHCLC\CnCtCzCCCCCCCCCCCCCCCD DDDD"D0DBDHDNDTDXDfDxD~DDDDDDDDDDDDDDDEEEE"E(E,E:ELEPEVE\E`EnEEEEEEEEEEEEEEEEFFF F$F*F0F4FBFTFXF^FdFhFxFFFFFFFFFFFFFFGGG GG,G2G8G>GBGPGbGhGnGtGxGGGGGGGGGGGGGHHH HHH$H6H<HBHHHLHZHlHpHvH|HHHHHHHHHHHHHHI IIII I0IBIFILIRIVIfIx999R09RFOH Family Cir. S4/26 front1150R64oLOBXR-0 S4/19 front2150R64oLOBXR-0 S4/19 front4414R12oLOBXR-0 S4/36 front3412R12oLOBXR-0 S4/36 front3149R64oLOBXL-0 S4/19 front4149R64oLOBXL-0 S4/19 front2424R12oLOBXL-0 S4/36 front1422R12oLOBXL-0 S4/36 front6732R67R FOH Balcony S4/26 front157737R67R FOH Balcony S4/26 front237807NC7N 1 Electric" S4/26 front177827NC7N 1 Electric" S4/19 front137847NC7N 1 Electric" S4/19 front117837R62R 1 Electric" S4/19 front9862R60R 4 Electric" S4/19 front110870R60R 4 Electric" S4/19 front9870R60R 6 Electric-0H S4/19 front4880R60R 6 Electric-0H S4/19 front5890R60R 7 Electric-0H S4/19 front4890R60R 7 Electric-0H S4/19 front2900NC0N 8 Electric-0H S4/19 front6100NC0NFOH Upper Box SR-0 S4/19 front910011FOH Upper Box SR-0 S4/19 front6100NC0NFOH Upper Box SL-0 S4/19 front9990R65oFOH Upper Box SL-0 S4/19 front125153NC3o FOH Balcony S4/19 front18312311 1 Electric" S4/19 front163122R60R 1 Electric" S4/19 front100121R65o 1 Electric" S4/26 front7129R16o 6 Electric-0H S4/19 back-6129R16o 6 Electric-0H S4/26 back-5129R16o 6 Electric-0H S4/36 back-226124NC4N 1 Electric" S4/19 front712511 2 Electric" S4/19 front11512611 2 Electric" S4/19 front146127R67o 2 Electric" S4/19 front187128R70R 2 Electric" S4/19 front2119R60x 1 Boom SL-0 S4/19 side05136R60o 1 Boom SL-0 S4/26 side04350R09R 1 Boom SL-0 S4/26 side03359R09R 1 Boom SL-0 S4/26 side08147R64o 1 Boom SL-0 s4/50 side02141R02oSL Portal Boom-0 s4/50 sideB1145R64oSL Portal Boom-0 s4/50 sideB3134R09o 2 Boom SL-0 S4/26 side02120R65o 1 Boom SR-0 S4/36 side05135R60o 1 Boom SR-0 S4/26 side04370R09R 1 Boom SR-0 S4/26 side03379R09R 1 Boom SR-0 S4/26 side07144R02o 1 Boom SR-0 s4/50 side02142R02oSR Portal Boom-0 s4/50 sideB1146R64oSR Portal Boom-0 s4/50 sideB3139NC9NFOH Upper Box SL-0 S4/10 front2117R62RFOH Upper Box SL-0 S4/10 front1117R62RFOH Upper Box SL-0 S4/10 front1140R60RFOH Upper Box SR-0 S4/10 front3118R65RFOH Upper Box SR-0 S4/19 front2118R65RFOH Upper Box SR-0 S4/19 front1119R60x 1 Boom SL-0 S4/19 side07143R02o 1 Boom SL-0 s4/50 side01120R65o 1 Boom SR-0 S4/36 side01116R02o 2 Boom SR-0 s4/50 side02116R02o 2 Boom SR-0 s4/50 side0182452R77R FOH Balcony S4/19 front197467R77R FOH Balcony S4/26 front177457R77R FOH Balcony S4/19 front4447R77R FOH Balcony S4/19 front117152NC2o FOH Balcony S4/19 front102152NC2o FOH Balcony S4/19 front9151NC1o FOH Balcony S4/19 front3441R77R FOH Balcony S4/19 front2437R57o FOH Balcony S4/26 front147727R62o FOH Balcony S4/19 front132722R62o FOH Balcony S4/19 front8712R09o FOH Balcony S4/19 front7719R09o FOH Balcony S4/19 front169749R77R FOH Balcony S4/26 front5747R77R FOH Balcony S4/26 front137164NC4NFOH Family Cir.ETC 10124774R68oFOH Family Cir.ETC 10118758R68oFOH Family Cir.ETC 10108758R68oFOH Family Cir.ETC 108768R68oFOH Family Cir.ETC 107768R68oFOH Family Cir.ETC 106788R68oFOH Family Cir.ETC 105163R60RFOH Family Cir.ETC 106810NC0N 1 Electric" S4/26 front120850R60R 2 Electric" S4/19 front8920R60R 4 Electric" S4/19 back"691099 4 Electric" S4/19 front9930R67o 4 Electric" S4/19 front3130R65o 9 Electric-0H S4/19 back-2130R65o 9 Electric-0H S4/26 back-1130R65o 9 Electric-0H S4/36 back-105945R67o 4 Electric" S4/26 back"7967R67o 4 Electric" S4/26 back"117957R09o 6 Electric-0H S4/26 front9999 7 Electric-0H DATAFLASH2222 7 Electric-0H DATAFLASH8148R64o 1 Boom SR-0 s4/50 side05115R70R 1 Electric" S4/19 front100156R01oLOBXR-0 S4/36 front9156R01oLOBXR-0 S4/36 front201461R77R FOH Balcony S4/26 front1437R57o FOH Balcony S4/26 front107155R70oLOBXR-0 S4/36 front9155R70oLOBXR-0 S4/36 fronto39033 1 Electric" practical120970R64R 6 Electric-0H S4/26 front134131NC1N 6 Electric-0H S4/26 front4981R64R 6 Electric-0H S4/26 front5114R02o 1 Boom SR-0 S4/36 side0o167R60R 9 Electric-0HPAR VNSP - backR162R60R 9 Electric-0HPAR VNSP - backR162R60R 9 Electric-0HPAR VNSP - backR7R77R 1 Electric"PAR WFL - frontR8R67R 1 Electric"PAR WFL - frontR9R18R 1 Electric"PAR WFL - frontR7R77R 1 Electric"PAR WFL - frontR8R67R 1 Electric"PAR WFL - frontR9R18R 1 Electric"PAR WFL - frontR4R77R 1 Electric"PAR WFL - frontR5R67R 1 Electric"PAR WFL - frontR6R18R 1 Electric"PAR WFL - frontR4R77R 1 Electric"PAR WFL - frontR5R67R 1 Electric"PAR WFL - frontR6R18R 1 Electric"PAR WFL - frontR162R60R 9 Electric-0HPAR VNSP - backR165R60R 9 Electric-0HPAR VNSP - backR168R67R 2 Electric" S4/36 frontR169NC9NSL Portal Boom-0 S4/36 sideB269269R60R 1 Electric" S4/26 front250260R60R 1 Electric" S4/26 front3250R60R 1 Electric" S4/26 front290270R60R 1 Electric" S4/26 front280270R60R 1 Electric" S4/26 front2250R60R 1 Electric" S4/26 front3280R60R 2 Electric" S4/36 front5230R60RFOH Upper Box SR-0 S4/19 front4230R60RFOH Upper Box SR-0 S4/19 front8240R60RFOH Upper Box SR-0 S4/19 front7240R60RFOH Upper Box SR-0 S4/19 front5220R60RFOH Upper Box SL-0 S4/19 front4220R60RFOH Upper Box SL-0 S4/19 front8210R60RFOH Upper Box SL-0 S4/19 front7210R60RFOH Upper Box SL-0 S4/19 front4280R60R 2 Electric" S4/36 front5280R60R 2 Electric" S4/36 front220290R60R 2 Electric" S4/36 front210290R60R 2 Electric" S4/36 front200290R60R 2 Electric" S4/36 front140300R67R 6 Electric-0H S4/26 front157307R67R 6 Electric-0H S4/26 front167307R67R 6 Electric-0H S4/26 front217157R67R 1 Electric" S4/26 front207157R67R 1 Electric" S4/26 front8167R67R 1 Electric" S4/26 front9167R67R 1 Electric" S4/26 front3147R67RFOH Family Cir.ETC 101137R67RFOH Family Cir.ETC 104147R67RFOH Family Cir.ETC 102137R67RFOH Family Cir.ETC 10177127R67RFOH Family Cir.ETC 10R60170R67R 1 Electric" S4/26 front157177R67R 1 Electric" S4/26 front157117R67RFOH Family Cir.ETC 10147117R67RFOH Family Cir.ETC 10157187R67R 2 Electric" S4/36 front167127R67RFOH Family Cir.ETC 10167187R67R 2 Electric" S4/26 front177187R67R 2 Electric" S4/26 front9197R67R 2 Electric" S4/26 front8197R67R 2 Electric" S4/26 front107197R67R 2 Electric" S4/36 front1207R67R 6 Electric-0H S4/26 front2207R67R 6 Electric-0H S4/26 front3207R67R 6 Electric-0H S4/26 front7317R09RLOBXR-0 S4/19 front8319R09RLOBXR-0 S4/19 front5329R09RLOBXR-0 S4/19 front6329R09RLOBXR-0 S4/19 front7349R09RLOBXL-0 S4/19 front8349R09RLOBXL-0 S4/19 front5339R09RLOBXL-0 S4/19 front6339R09RLOBXL-0 S4/19 front4609R77R 9 Electric-0HPAR VNSP - back5607R77R 9 Electric-0HPAR VNSP - back6607R77R 9 Electric-0HPAR VNSP - back307547R77R 1 Electric"PAR NSP - backO1517R77R 1 Electric"PAR NSP - backO4527R77R 1 Electric"PAR NSP - backO277537R77R 1 Electric"PAR NSP - backO237577R77R 2 Electric"PAR NSP - backO247577R77R 2 Electric"PAR NSP - backO2557R77R 2 Electric"PAR NSP - backO1557R77R 2 Electric"PAR NSP - backO137567R77R 4 Electric"PAR NSP - backO5567R77R 4 Electric"PAR NSP - backO167597R77R 4 Electric"PAR MFL - backO177597R77R 4 Electric"PAR MFL - backO2587R77R 4 Electric"PAR MFL - backO1587R77R 4 Electric"PAR MFL - backO9607R77R 9 Electric-0HPAR VNSP - back8607R77R 9 Electric-0HPAR VNSP - back7607R77R 9 Electric-0HPAR VNSP - back247647R16R 1 Electric"PAR MFL - backO196636R16R 1 Electric"PAR MFL - backO126626R16R 1 Electric"PAR MFL - backO6656R16R 2 Electric"PAR WFL - backO7616R16R 1 Electric"PAR MFL - backO136666R16R 2 Electric"PAR WFL - backO196676R16R 2 Electric"PAR WFL - backO4686R16R 4 Electric"PAR WFL - backO146696R16R 4 Electric"PAR WFL - backO3706R16R 7 Electric-0HPAR WFL - backO8706R16R 7 Electric-0HPAR WFL - backO7706R16R 7 Electric-0HPAR WFL - backO=`  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~By,'`<$A=`  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~By,'`<*A=`  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'y,'`<jA dnx",6@JT^hr|    & 0 : D N X b l v !! !! !*!4!>!H!R!\!f!p!z!!!!!!!!!!!!!""""$"."8"B"L"V"`"j"t"~""""""""""""## ###(#2#<#F#P#Z#d#n#x#############$$$$"$,$6$@$J$T$^$h$r$|$$$$$$$$$$$$$%%%%&%0%:%D%N%X%b%l%v%%%%%%%%%%%%%&& && &*&4&>&H&R&\&f&p&z&&&&&&&&A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3A3..H3=`  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~">@y,'`DQ7aP  XHHHH.H3A3..H:$\ >DJPXXXXXX`  Unit # Channel Color Position  Type Emha[VInfoAe oX@hVInfoUnit #e oX@kVInfoChannele oX@j@VInfoColore  X@k@  @k@ , 9 Fy,pAd3..HAdx.H3A3..H:83A3..H3 :8A3..H3@:8A3..H3A3A3.<y,'`<EA &48>DN\`flv (.4:HV\bhv,:@FLZhlrx $*0@NRX^t"(.<JPVZhv|  .28>N\bhn| .<@FLZhlrx "(<JNTZn| ,06<JX\bhv &,BPTZ`v $*0>LPV\jx|     * 0 6 < J X ^ d j x !!!!!!,!:!>!D!J!X!f!j!p!v!!!!!!!!!!!!!!!" """$"*"8"F"L"R"X"f"t"x"~"""""""""""""#### #*#0#6#<#N#X#\#b#h#z###############$$ $$$&$4$:$@$F$T$b$f$l$r$$$$$$$$$$$$$$$%%%%%"%2%@%D%J%P%`%n%t%z%%%%%%%%%%%%%%&&&& &$&(&,&<&H&L&R&X&f&t&x&~&&&&&&&&&&&&&&&''' '$'*'0'>'L'R'X'^'h'v'z'''''''''''''''((((&(*(0(6(F(T(X(^(d(r(((((((((((((()))))$)2)D)H)L)R)`)r)v)z)))))))))))))*** ****.*2*8*F*X*\*`*f*t***************+++++,+>+B+H+N+^+p+t+z++++++++++++,,, ,, ,.,4,:,@,N,\,`,f,l,z,,,,,,,,,,,,,,----- -.-<-@-F-L-b-p-t-z------------. ....2.@.D.J.P.f.t.x.~............// ///&/4/:/@/F/T/b/h/n/t//////////////0000$0*000@0N0T0Z0`0n0|00000000000000111 11$1.12181>1P1Z1^1d1j1|1111111111111122222 2.2<2B2H2N2`2j2p2v2|22222222222223333"3(3.343B3P3T3Z3`3n3|3333333333333344444$42464<4B4R4`4d4j4p4z444444444444444555 555(5,52585B5P5T5Z5`5j5x5|555555555555566666$666<6B6H6V6h6l6r6x666666666666777 77,72787>7L7^7b7h7n7|7777777777777888 8&8,828@8R8X8^8d8r888888888888889999 9&969H9L9R9X9h9z99999999999999:::: :.:@:D:J:P:^:p:v:|::::::::::::;; ;;;$;6;:;@;F;V;h;l;r;x;;;;;;;9996R09FOH Family Cir. S4/26 front1150R64LOBXR-0 S4/19 front2150R64LOBXR-0 S4/19 front4414R12LOBXR-0 S4/36 front3412R12LOBXR-0 S4/36 front3149R64LOBXL-0 S4/19 front4149R64LOBXL-0 S4/19 front2424R12LOBXL-0 S4/36 front1422R12LOBXL-0 S4/36 front6732R67 FOH Balcony S4/26 front157737R67 FOH Balcony S4/26 front237807NC7 1 Electric" S4/26 front177827NC7 1 Electric" S4/19 front137847NC7 1 Electric" S4/19 front117837R62 1 Electric" S4/19 front9862R60 4 Electric" S4/19 front110870R60 4 Electric" S4/19 front9870R60 6 Electric-0H S4/19 front4880R60 6 Electric-0H S4/19 front5890R60 7 Electric-0H S4/19 front4890R60 7 Electric-0H S4/19 front2900NC0 8 Electric-0H S4/19 front6100NC0FOH Upper Box SR-0 S4/19 front91001FOH Upper Box SR-0 S4/19 front6100NC0FOH Upper Box SL-0 S4/19 front9990R65FOH Upper Box SL-0 S4/19 front125153NC3 FOH Balcony S4/19 front1831231 1 Electric" S4/19 front163122R60 1 Electric" S4/19 front100121R65 1 Electric" S4/26 front7129R16 6 Electric-0H S4/19 back-6129R16 6 Electric-0H S4/26 back-5129R16 6 Electric-0H S4/36 back-226124NC4 1 Electric" S4/19 front71251 2 Electric" S4/19 front1151261 2 Electric" S4/19 front146127R67 2 Electric" S4/19 front187128R70 2 Electric" S4/19 front2119R60 1 Boom SL-0 S4/19 side05136R60 1 Boom SL-0 S4/26 side04350R09 1 Boom SL-0 S4/26 side03359R09 1 Boom SL-0 S4/26 side08147R64 1 Boom SL-0 s4/50 side02141R02SL Portal Boom-0 s4/50 sideB1145R64SL Portal Boom-0 s4/50 sideB3134R09 2 Boom SL-0 S4/26 side02120R65 1 Boom SR-0 S4/36 side05135R60 1 Boom SR-0 S4/26 side04370R09 1 Boom SR-0 S4/26 side03379R09 1 Boom SR-0 S4/26 side07144R02 1 Boom SR-0 s4/50 side02142R02SR Portal Boom-0 s4/50 sideB1146R64SR Portal Boom-0 s4/50 sideB3139NC9FOH Upper Box SL-0 S4/10 front2117R62FOH Upper Box SL-0 S4/10 front1117R62FOH Upper Box SL-0 S4/10 front1140R60FOH Upper Box SR-0 S4/10 front3118R65FOH Upper Box SR-0 S4/19 front2118R65FOH Upper Box SR-0 S4/19 front1119R60 1 Boom SL-0 S4/19 side07143R02 1 Boom SL-0 s4/50 side01120R65 1 Boom SR-0 S4/36 side01116R02 2 Boom SR-0 s4/50 side02116R02 2 Boom SR-0 s4/50 side0182452R77 FOH Balcony S4/19 front197467R77 FOH Balcony S4/26 front177457R77 FOH Balcony S4/19 front4447R77 FOH Balcony S4/19 front117152NC2 FOH Balcony S4/19 front102152NC2 FOH Balcony S4/19 front9151NC1 FOH Balcony S4/19 front3441R77 FOH Balcony S4/19 front2437R57 FOH Balcony S4/26 front147727R62 FOH Balcony S4/19 front132722R62 FOH Balcony S4/19 front8712R09 FOH Balcony S4/19 front7719R09 FOH Balcony S4/19 front169749R77 FOH Balcony S4/26 front5747R77 FOH Balcony S4/26 front137164NC4FOH Family Cir.ETC 10124774R68FOH Family Cir.ETC 10118758R68FOH Family Cir.ETC 10108758R68FOH Family Cir.ETC 108768R68FOH Family Cir.ETC 107768R68FOH Family Cir.ETC 106788R68FOH Family Cir.ETC 105163R60FOH Family Cir.ETC 106810NC0 1 Electric" S4/26 front120850R60 2 Electric" S4/19 front8920R60 4 Electric" S4/19 back"69109 4 Electric" S4/19 front9930R67 4 Electric" S4/19 front3130R65 9 Electric-0H S4/19 back-2130R65 9 Electric-0H S4/26 back-1130R65 9 Electric-0H S4/36 back-105945R67 4 Electric" S4/26 back"7967R67 4 Electric" S4/26 back"117957R09 6 Electric-0H S4/26 front999 7 Electric-0H DATAFLASH222 7 Electric-0H DATAFLASH8148R64 1 Boom SR-0 s4/50 side05115R70 1 Electric" S4/19 front100156R01LOBXR-0 S4/36 front9156R01LOBXR-0 S4/36 front201461R77 FOH Balcony S4/26 front1437R57 FOH Balcony S4/26 front107155R70LOBXR-0 S4/36 front9155R70LOBXR-0 S4/36 frontR3903 1 Electric" practical120970R64 6 Electric-0H S4/26 front134131NC1 6 Electric-0H S4/26 front4981R64 6 Electric-0H S4/26 front5114R02 1 Boom SR-0 S4/36 side0R167R60 9 Electric-0HPAR VNSP - backR162R60 9 Electric-0HPAR VNSP - backR162R60 9 Electric-0HPAR VNSP - backR7R77 1 Electric"PAR WFL - frontR8R67 1 Electric"PAR WFL - frontR9R18 1 Electric"PAR WFL - frontR7R77 1 Electric"PAR WFL - frontR8R67 1 Electric"PAR WFL - frontR9R18 1 Electric"PAR WFL - frontR4R77 1 Electric"PAR WFL - frontR5R67 1 Electric"PAR WFL - frontR6R18 1 Electric"PAR WFL - frontR4R77 1 Electric"PAR WFL - frontR5R67 1 Electric"PAR WFL - frontR6R18 1 Electric"PAR WFL - frontR162R60 9 Electric-0HPAR VNSP - backR165R60 9 Electric-0HPAR VNSP - backR168R67 2 Electric" S4/36 frontR169NC9SL Portal Boom-0 S4/36 sideB269269R60 1 Electric" S4/26 front250260R60 1 Electric" S4/26 front3250R60 1 Electric" S4/26 front290270R60 1 Electric" S4/26 front280270R60 1 Electric" S4/26 front2250R60 1 Electric" S4/26 front3280R60 2 Electric" S4/36 front5230R60FOH Upper Box SR-0 S4/19 front4230R60FOH Upper Box SR-0 S4/19 front8240R60FOH Upper Box SR-0 S4/19 front7240R60FOH Upper Box SR-0 S4/19 front5220R60FOH Upper Box SL-0 S4/19 front4220R60FOH Upper Box SL-0 S4/19 front8210R60FOH Upper Box SL-0 S4/19 front7210R60FOH Upper Box SL-0 S4/19 front4280R60 2 Electric" S4/36 front5280R60 2 Electric" S4/36 front220290R60 2 Electric" S4/36 front210290R60 2 Electric" S4/36 front200290R60 2 Electric" S4/36 front140300R67 6 Electric-0H S4/26 front157307R67 6 Electric-0H S4/26 front167307R67 6 Electric-0H S4/26 front217157R67 1 Electric" S4/26 front207157R67 1 Electric" S4/26 front8167R67 1 Electric" S4/26 front9167R67 1 Electric" S4/26 front3147R67FOH Family Cir.ETC 101137R67FOH Family Cir.ETC 104147R67FOH Family Cir.ETC 102137R67FOH Family Cir.ETC 10177127R67FOH Family Cir.ETC 10R60170R67 1 Electric" S4/26 front157177R67 1 Electric" S4/26 front157117R67FOH Family Cir.ETC 10147117R67FOH Family Cir.ETC 10157187R67 2 Electric" S4/36 front167127R67FOH Family Cir.ETC 10167187R67 2 Electric" S4/26 front177187R67 2 Electric" S4/26 front9197R67 2 Electric" S4/26 front8197R67 2 Electric" S4/26 front107197R67 2 Electric" S4/36 front1207R67 6 Electric-0H S4/26 front2207R67 6 Electric-0H S4/26 front3207R67 6 Electric-0H S4/26 front7317R09LOBXR-0 S4/19 front8319R09LOBXR-0 S4/19 front5329R09LOBXR-0 S4/19 front6329R09LOBXR-0 S4/19 front7349R09LOBXL-0 S4/19 front8349R09LOBXL-0 S4/19 front5339R09LOBXL-0 S4/19 front6339R09LOBXL-0 S4/19 front4609R77 9 Electric-0HPAR VNSP - back5607R77 9 Electric-0HPAR VNSP - back6607R77 9 Electric-0HPAR VNSP - back307547R77 1 Electric"PAR NSP - backO1517R77 1 Electric"PAR NSP - backO4527R77 1 Electric"PAR NSP - backO277537R77 1 Electric"PAR NSP - backO237577R77 2 Electric"PAR NSP - backO247577R77 2 Electric"PAR NSP - backO2557R77 2 Electric"PAR NSP - backO1557R77 2 Electric"PAR NSP - backO137567R77 4 Electric"PAR NSP - backO5567R77 4 Electric"PAR NSP - backO167597R77 4 Electric"PAR MFL - backO177597R77 4 Electric"PAR MFL - backO2587R77 4 Electric"PAR MFL - backO1587R77 4 Electric"PAR MFL - backO9607R77 9 Electric-0HPAR VNSP - back8607R77 9 Electric-0HPAR VNSP - back7607R77 9 Electric-0HPAR VNSP - back247647R16 1 Electric"PAR MFL - backO196636R16 1 Electric"PAR MFL - backO126626R16 1 Electric"PAR MFL - backO6656R16 2 Electric"PAR WFL - backO7616R16 1 Electric"PAR MFL - backO136666R16 2 Electric"PAR WFL - backO196676R16 2 Electric"PAR WFL - backO4686R16 4 Electric"PAR WFL - backO146696R16 4 Electric"PAR WFL - backO3706R16 7 Electric-0HPAR WFL - backO8706R16 7 Electric-0HPAR WFL - backO7706R16 7 Electric-0HPAR WFL - backO=`  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~">@y,'`aQp  XHHHHg.q*(Hr"("xrh*h+T$ް$؀r,qg.q*(Hr"("xrh| -A| `ront127|*@Z8rXXXXXX`X  Unit # Channel Color Template  (Type (Position c' 4a[VInfoAe J@hVInfoUnit #e J@kVInfoChannele J@j@VInfoColore J@MVInfo Templatee ;@k@ ;@k@ , 9 Fy,pAdront1-A| `dx| -A| `ront127| `| -@T@ric S4/26| `nt137167R67 2 Electric S4/26 front197By,'`<cA ,06<@NX\bhlz *48>DHV`djpt &,26DRX^dhv "(,:JNTZ^l|"&4JNTX\j"(.26DRX^dhv $*.<LRX^bp~ $2@DJPTbptz    " 0 4 : @ D R f j p v z !!! !!!,!0!6!<!@!N!\!`!f!l!p!~!!!!!!!!!!!!!!!""""(","2"8"<"J"`"d"j"p"t"""""""""""""## ####*#@#D#J#P#T#b#x#|################$$ $$$$*$8$<$B$H$L$Z$h$n$t$z$~$$$$$$$$$$$$$$%%%%% %.%4%:%@%D%R%`%f%l%r%v%%%%%%%%%%%%%%%%&&&&"&(&.&4&8&F&T&Z&`&f&j&x&&&&&&&&&&&&&&&&&' '''"'(',':'H'N'T'Z'^'h'z'''''''''''''''''(((( ($(.(@(D(J(P(T(^(p(t(z((((((((((((((())) )))$)2)6)<)B)F)T)b)f)l)p)t))))))))))))))))****$*(*.*4*8*F*V*\*b*h*l*z*****************++++ +$+(+4+D+H+N+T+X+f+t+x+~++++++++++++++++,, ,,,",0,4,:,@,D,R,`,f,l,r,v,,,,,,,,,,,,,,,,,,- -- -&-,-0->-N-R-X-^-b-p-----------------. .. .&.,.0.B.R.V.Z.`.d.v................./ ///"/(/,/>/L/P/T/Z/^/p/~////////////////00000"0&080F0J0N0T0X0j0x0|0000000000000001111 1&1*181F1J1P1V1Z1h1|111111111111111122222"2&242B2H2N2T2X2f2t2x2~2222222222222223 3333 3.3D3H3N3T3X3f3|333333333333333444$4(4.44484F4\4`4f4l4p4~44444444444444555 55&5,52585<5J5X5^5d5j5n5|5555555555555556666&6,62686<6J6X6^6d6j6n6|666666666666666667777$7*7.787J7N7T7Z7^7h7z7~77777777777777788888 8$828@8F8L8R8V8`8r8x8~888888888888888999999,9:9@9F9L9P9^9l9p9v9|999999999999999::::: :0:4:::@:D:R:b:f:l:r:v:::::::::::::::::;;;;;";(;,;:;D;H;N;T;X;f;p;t;z;;;;;;;;;;;;;;;;;;<<<<*<.<4<:<> >>>>>0>>>D>J>P>T>f>t>x>~>>>>>>>>>>>>>>?????$?(?:?H?L?R?X?\?n?|????????????????@@@$@*@0@4@F@T@Z@`@f@j@|@@@@@@@@@@@@@@@AAAA(A.A4A:A>APA^AdAjApAtAAAAAAAAAAAAAABBBBB$B4B8B>BDBHBZBjBnBtBzB~BB9996R09R S4/26 frontFOH Family Cir.1150R64o S4/19 frontLOBXR-02150R64o S4/19 frontLOBXR-04414R12o S4/36 frontLOBXR-03412R12o S4/36 frontLOBXR-03149R64o S4/19 frontLOBXL-04149R64o S4/19 frontLOBXL-02424R12o S4/36 frontLOBXL-01422R12o S4/36 frontLOBXL-06732R67R S4/26 front FOH Balcony157737R67R S4/26 front FOH Balcony237807NC7N S4/26 front 1 Electrict177827NC7N S4/19 front 1 Electrict137847NC7N S4/19 front 1 Electrict117837R62R S4/19 front 1 Electrict9862R60R S4/19 front 4 Electrict110870R60R S4/19 front 4 Electrict9870R60R S4/19 front 6 Electric-0H4880R60R S4/19 front 6 Electric-0H5890R60R S4/19 front 7 Electric-0H4890R60R S4/19 front 7 Electric-0H2900NC0N S4/19 front 8 Electric-0H6100NC0N S4/19 frontFOH Upper Box SR-0910011 S4/19 frontFOH Upper Box SR-06100NC0N S4/19 frontFOH Upper Box SL-09990R65o S4/19 frontFOH Upper Box SL-0125153NC3o S4/19 front FOH Balcony18312311 S4/19 front 1 Electrict163122R60R S4/19 front 1 Electrict100121R65o S4/26 front 1 Electrict7129R16o S4/19 back" 6 Electric-0H6129R16o S4/26 back" 6 Electric-0H5129R16o S4/36 back" 6 Electric-0H226124NC4N S4/19 front 1 Electrict712511 S4/19 front 2 Electrict11512611 S4/19 front 2 Electrict146127R67o S4/19 front 2 Electrict187128R70R S4/19 front 2 Electrict2119R60x S4/19 side" 1 Boom SL-05136R60o S4/26 side" 1 Boom SL-04350R09R S4/26 side" 1 Boom SL-03359R09R S4/26 side" 1 Boom SL-08147R64o s4/50 side" 1 Boom SL-02141R02o s4/50 side"SL Portal Boom-01145R64o s4/50 side"SL Portal Boom-03134R09o S4/26 side" 2 Boom SL-02120R65o S4/36 side" 1 Boom SR-05135R60o S4/26 side" 1 Boom SR-04370R09R S4/26 side" 1 Boom SR-03379R09R S4/26 side" 1 Boom SR-07144R02o s4/50 side" 1 Boom SR-02142R02o s4/50 side"SR Portal Boom-01146R64o s4/50 side"SR Portal Boom-03139NC9N S4/10 frontFOH Upper Box SL-02117R62R S4/10 frontFOH Upper Box SL-01117R62R S4/10 frontFOH Upper Box SL-01140R60R S4/10 frontFOH Upper Box SR-03118R65R S4/19 frontFOH Upper Box SR-02118R65R S4/19 frontFOH Upper Box SR-01119R60x S4/19 side" 1 Boom SL-07143R02o s4/50 side" 1 Boom SL-01120R65o S4/36 side" 1 Boom SR-01116R02o s4/50 side" 2 Boom SR-02116R02o s4/50 side" 2 Boom SR-0182452R77R S4/19 front FOH Balcony197467R77R S4/26 front FOH Balcony177457R77R S4/19 front FOH Balcony4447R77R S4/19 front FOH Balcony117152NC2o S4/19 front FOH Balcony102152NC2o S4/19 front FOH Balcony9151NC1o S4/19 front FOH Balcony3441R77R S4/19 front FOH Balcony2437R57o S4/26 front FOH Balcony147727R62o S4/19 front FOH Balcony132722R62o S4/19 front FOH Balcony8712R09o S4/19 front FOH Balcony7719R09o S4/19 front FOH Balcony169749R77R S4/26 front FOH Balcony5747R77R S4/26 front FOH Balcony137164NC4NETC 10FOH Family Cir.124774R68oETC 10FOH Family Cir.118758R68oETC 10FOH Family Cir.108758R68oETC 10FOH Family Cir.8768R68oETC 10FOH Family Cir.7768R68oETC 10FOH Family Cir.6788R68oETC 10FOH Family Cir.5163R60RETC 10FOH Family Cir.6810NC0N S4/26 front 1 Electrict120850R60R S4/19 front 2 Electrict8920R60R S4/19 back" 4 Electric"691099 S4/19 front 4 Electrict9930R67o S4/19 front 4 Electrict3130R65o S4/19 back" 9 Electric-0H2130R65o S4/26 back" 9 Electric-0H1130R65o S4/36 back" 9 Electric-0H105945R67o S4/26 back" 4 Electric"7967R67o S4/26 back" 4 Electric"117957R09o S4/26 front 6 Electric-0H9999 DATAFLASH 7 Electric-0H2222 DATAFLASH 7 Electric-0H8148R64o s4/50 side" 1 Boom SR-05115R70R S4/19 front 1 Electrict100156R01o S4/36 frontLOBXR-09156R01o S4/36 frontLOBXR-0201461R77R S4/26 front FOH Balcony1437R57o S4/26 front FOH Balcony107155R70o S4/36 frontLOBXR-09155R70o S4/36 frontLOBXR-0o39033 practical 1 Electric"120970R64R S4/26 front 6 Electric-0H134131NC1N S4/26 front 6 Electric-0H4981R64R S4/26 front 6 Electric-0H5114R02o S4/36 side" 1 Boom SR-0o167R60RPAR VNSP - back 9 Electric-0aR162R60RPAR VNSP - back 9 Electric-0aR162R60RPAR VNSP - back 9 Electric-0aR7R77RPAR WFL - front 1 ElectricfR8R67RPAR WFL - front 1 ElectricfR9R18RPAR WFL - front 1 ElectricfR7R77RPAR WFL - front 1 ElectricfR8R67RPAR WFL - front 1 ElectricfR9R18RPAR WFL - front 1 ElectricfR4R77RPAR WFL - front 1 ElectricfR5R67RPAR WFL - front 1 ElectricfR6R18RPAR WFL - front 1 ElectricfR4R77RPAR WFL - front 1 ElectricfR5R67RPAR WFL - front 1 ElectricfR6R18RPAR WFL - front 1 ElectricfR162R60RPAR VNSP - back 9 Electric-0aR165R60RPAR VNSP - back 9 Electric-0aR168R67R S4/36 front 2 ElectrictR169NC9N S4/36 side"SL Portal Boom-0269269R60R S4/26 front 1 Electrict250260R60R S4/26 front 1 Electrict3250R60R S4/26 front 1 Electrict290270R60R S4/26 front 1 Electrict280270R60R S4/26 front 1 Electrict2250R60R S4/26 front 1 Electrict3280R60R S4/36 front 2 Electrict5230R60R S4/19 frontFOH Upper Box SR-04230R60R S4/19 frontFOH Upper Box SR-08240R60R S4/19 frontFOH Upper Box SR-07240R60R S4/19 frontFOH Upper Box SR-05220R60R S4/19 frontFOH Upper Box SL-04220R60R S4/19 frontFOH Upper Box SL-08210R60R S4/19 frontFOH Upper Box SL-07210R60R S4/19 frontFOH Upper Box SL-04280R60R S4/36 front 2 Electrict5280R60R S4/36 front 2 Electrict220290R60R S4/36 front 2 Electrict210290R60R S4/36 front 2 Electrict200290R60R S4/36 front 2 Electrict140300R67R S4/26 front 6 Electric-0H157307R67R S4/26 front 6 Electric-0H167307R67R S4/26 front 6 Electric-0H217157R67R S4/26 front 1 Electrict207157R67R S4/26 front 1 Electrict8167R67R S4/26 front 1 Electrict9167R67R S4/26 front 1 Electrict3147R67RETC 10FOH Family Cir.1137R67RETC 10FOH Family Cir.4147R67RETC 10FOH Family Cir.2137R67RETC 10FOH Family Cir.177127R67RETC 10FOH Family Cir.R60170R67R S4/26 front 1 Electrict157177R67R S4/26 front 1 Electrict157117R67RETC 10FOH Family Cir.147117R67RETC 10FOH Family Cir.157187R67R S4/36 front 2 Electrict167127R67RETC 10FOH Family Cir.167187R67R S4/26 front 2 Electrict177187R67R S4/26 front 2 Electrict9197R67R S4/26 front 2 Electrict8197R67R S4/26 front 2 Electrict107197R67R S4/36 front 2 Electrict1207R67R S4/26 front 6 Electric-0H2207R67R S4/26 front 6 Electric-0H3207R67R S4/26 front 6 Electric-0H7317R09R S4/19 frontLOBXR-08319R09R S4/19 frontLOBXR-05329R09R S4/19 frontLOBXR-06329R09R S4/19 frontLOBXR-07349R09R S4/19 frontLOBXL-08349R09R S4/19 frontLOBXL-05339R09R S4/19 frontLOBXL-06339R09R S4/19 frontLOBXL-04609R77RPAR VNSP - back 9 Electric-0a5607R77RPAR VNSP - back 9 Electric-0a6607R77RPAR VNSP - back 9 Electric-0a307547R77RPAR NSP - backO 1 Electricb1517R77RPAR NSP - backO 1 Electricb4527R77RPAR NSP - backO 1 Electricb277537R77RPAR NSP - backO 1 Electricb237577R77RPAR NSP - backO 2 Electricb247577R77RPAR NSP - backO 2 Electricb2557R77RPAR NSP - backO 2 Electricb1557R77RPAR NSP - backO 2 Electricb137567R77RPAR NSP - backO 4 Electricb5567R77RPAR NSP - backO 4 Electricb167597R77RPAR MFL - backO 4 Electricb177597R77RPAR MFL - backO 4 Electricb2587R77RPAR MFL - backO 4 Electricb1587R77RPAR MFL - backO 4 Electricb9607R77RPAR VNSP - back 9 Electric-0a8607R77RPAR VNSP - back 9 Electric-0a7607R77RPAR VNSP - back 9 Electric-0a247647R16RPAR MFL - backO 1 Electricb196636R16RPAR MFL - backO 1 Electricb126626R16RPAR MFL - backO 1 Electricb6656R16RPAR WFL - backO 2 Electricb7616R16RPAR MFL - backO 1 Electricb136666R16RPAR WFL - backO 2 Electricb196676R16RPAR WFL - backO 2 Electricb4686R16RPAR WFL - backO 4 Electricb146696R16RPAR WFL - backO 4 Electricb3706R16RPAR WFL - backO 7 Electric-0c8706R16RPAR WFL - backO 7 Electric-0c7706R16RPAR WFL - backO 7 Electric-0c=`  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~">@y,'`gQl_  XHHHH`*B&`XXXXXX`X  Unit # Channel Color Template  Dimmer h' 4a[VInfoAeP X@hVInfoUnit #e X@kVInfoChannele X@j@VInfoColore X@MVInfo Templatee XVInfoDimmere , 9 Fy,pAd`dx`@  @ ` @H-y,'`<hA  $(,28<@DJPTX\bhlptz"(.26<BHLPV\bfjntz~ $(,06:>BFLRVZ^djnrx~  &,26:>DHLPV\`dhntz~ $(,06<@DHNTX\`flptx~ &,048>DHLPV\`dhntx| "&,28<@FLRVZ^djnrx~"&,26:>DJNRX^dhlpv|       & , 0 4 8 > D H L P V \ ` d j p v z ~ !!! !!!!"!&!*!0!6!:!>!D!J!P!T!X!\!`!d!h!l!p!t!x!|!!!!!!!!!!!!!!!!!!!!!!!!!!""" """" "&"*"."2"8">"B"F"J"P"T"X"\"b"h"n"r"v"|""""""""""""""""""""""""""#### #####"#&#,#0#4#8#<#B#F#J#N#R#X#\#`#d#h#n#r#v#z#~#############################$$$ $$$$ $$$($,$2$8$<$@$D$J$P$T$X$\$b$h$l$p$v$|$$$$$$$$$$$$$$$$$$$$$$$$$%%%% %%%% %$%*%0%4%8%<%B%H%L%P%T%Z%`%d%h%l%r%x%|%%%%%%%%%%%%%%%%%%%%%%%%%%%&&& &&&&"&&&*&0&6&<&@&D&J&P&V&Z&^&d&j&p&t&x&~&&&&&&&&&&&&&&&&&&&&&&&&&''' '''' '$'(','2'8'<'@'D'J'P'T'X'\'b'h'l'p'v'|'''''''''''''''''''''''''((( (((("(&(,(2(8(<(@(F(L(R(V(Z(^(d(j(n(r(v(|(((((((((((((((((((((((((()))))))) )&),)0)4)8)>)D)H)L)P)V)\)`)d)h)n)t)x)|))))))))))))))))))))))))))*** *****"*&***0*6*:*>*D*J*P*T*X*^*d*j*n*r*x*~*************************++++++++"+&+,+2+6+:+>+D+J+N+R+V+\+b+f+j+n+t+z+~+++++++++++++++++++++++++,,, ,,,,,$,*,.,2,8,>,D,H,L,P,V,\,`,d,j,p,v,z,~,,,,,,,,,,,,,,,9996R09RR1150R64oo2150R64oo4414R12oo3412R12oo3149R64oo4149R64oo2424R12oo1422R12oo6732R67RR157737R67RR237807NC7NN177827NC7NN137847NC7NN117837R62RR9862R60RR110870R60RR9870R60RR4880R60RR5890R60RR4890R60RR2900NC0NN6100NC0NN91001116100NC0NN9990R65oo125153NC3oo183123111163122R60RR100121R65oo7129R16oo6129R16oo5129R16oo226124NC4NN7125111115126111146127R67oo187128R70RR2119R60xx5136R60oo4350R09RR3359R09RR8147R64oo2141R02oo1145R64oo3134R09oo2120R65oo5135R60oo4370R09RR3379R09RR7144R02oo2142R02oo1146R64oo3139NC9NN2117R62RR1117R62RR1140R60RR3118R65RR2118R65RR1119R60xx7143R02oo1120R65oo1116R02oo2116R02oo182452R77RR197467R77RR177457R77RR4447R77RR117152NC2oo102152NC2oo9151NC1oo3441R77RR2437R57oo147727R62oo132722R62oo8712R09oo7719R09oo169749R77RR5747R77RR137164NC4NN124774R68oo118758R68oo108758R68oo8768R68oo7768R68oo6788R68oo5163R60RR6810NC0NN120850R60RR8920R60RR69109999930R67oo3130R65oo2130R65oo1130R65oo105945R67oo7967R67oo117957R09oo99999222228148R64oo5115R70RR100156R01oo9156R01oo201461R77RR1437R57oo107155R70oo9155R70ooo390333120970R64RR134131NC1NN4981R64RR5114R02ooo167R60RRR162R60RRR162R60RRR7R77RRR8R67RRR9R18RRR7R77RRR8R67RRR9R18RRR4R77RRR5R67RRR6R18RRR4R77RRR5R67RRR6R18RRR162R60RRR165R60RRR168R67RRR169NC9NN269269R60RR250260R60RR3250R60RR290270R60RR280270R60RR2250R60RR3280R60RR5230R60RR4230R60RR8240R60RR7240R60RR5220R60RR4220R60RR8210R60RR7210R60RR4280R60RR5280R60RR220290R60RR210290R60RR200290R60RR140300R67RR157307R67RR167307R67RR217157R67RR207157R67RR8167R67RR9167R67RR3147R67RR1137R67RR4147R67RR2137R67RR177127R67RRR60170R67RR157177R67RR157117R67RR147117R67RR157187R67RR167127R67RR167187R67RR177187R67RR9197R67RR8197R67RR107197R67RR1207R67RR2207R67RR3207R67RR7317R09RR8319R09RR5329R09RR6329R09RR7349R09RR8349R09RR5339R09RR6339R09RR4609R77RR5607R77RR6607R77RR307547R77RR1517R77RR4527R77RR277537R77RR237577R77RR247577R77RR2557R77RR1557R77RR137567R77RR5567R77RR167597R77RR177597R77RR2587R77RR1587R77RR9607R77RR8607R77RR7607R77RR247647R16RR196636R16RR126626R16RR6656R16RR7616R16RR136666R16RR196676R16RR4686R16RR146696R16RR3706R16RR8706R16RR7706R16RR=`  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~">@y,'`#Qv  XHHHH,]{;X@z{\*Bz ZXXXXXX`X  Unit # Channel Color Template  Dimmer ?' 4a[VInfoAe @hVInfoUnit #e @kVInfoChannele @j@VInfoColore @MVInfo Templatee VInfoDimmere , 9 Fy,pA"z{{;X@]dx,]{;X@z{\]{;dP;ea`^ '';dP;epa@^ \\];dP;e-y,'`<?A  $(,28<@DJPTX\bhlptz"(.26<BHLPV\bfjntz~ $(,06:>BFLRVZ^djnrx~  &,26:>DHLPV\`dhntz~ $(,06<@DHNTX\`flptx~ &,048>DHLPV\`dhntx| "&,28<@FLRVZ^djnrx~"&,26:>DJNRX^dhlpv|       & , 0 4 8 > D H L P V \ ` d j p v z ~ !!! !!!!"!&!*!0!6!:!>!D!J!P!T!X!\!`!d!h!l!p!t!x!|!!!!!!!!!!!!!!!!!!!!!!!!!!""" """" "&"*"."2"8">"B"F"J"P"T"X"\"b"h"n"r"v"|""""""""""""""""""""""""""#### #####"#&#,#0#4#8#<#B#F#J#N#R#X#\#`#d#h#n#r#v#z#~#############################$$$ $$$$ $$$($,$2$8$<$@$D$J$P$T$X$\$b$h$l$p$v$|$$$$$$$$$$$$$$$$$$$$$$$$$%%%% %%%% %$%*%0%4%8%<%B%H%L%P%T%Z%`%d%h%l%r%x%|%%%%%%%%%%%%%%%%%%%%%%%%%%%&&& &&&&"&&&*&0&6&<&@&D&J&P&V&Z&^&d&j&p&t&x&~&&&&&&&&&&&&&&&&&&&&&&&&&''' '''' '$'(','2'8'<'@'D'J'P'T'X'\'b'h'l'p'v'|'''''''''''''''''''''''''((( (((("(&(,(2(8(<(@(F(L(R(V(Z(^(d(j(n(r(v(|(((((((((((((((((((((((((()))))))) )&),)0)4)8)>)D)H)L)P)V)\)`)d)h)n)t)x)|))))))))))))))))))))))))))*** *****"*&***0*6*:*>*D*J*P*T*X*^*d*j*n*r*x*~*************************++++++++"+&+,+2+6+:+>+D+J+N+R+V+\+b+f+j+n+t+z+~+++++++++++++++++++++++++,,, ,,,,,$,*,.,2,8,>,D,H,L,P,V,\,`,d,j,p,v,z,~,,,,,,,,,,,,,,,9996R09RR1150R64oo2150R64oo4414R12oo3412R12oo3149R64oo4149R64oo2424R12oo1422R12oo6732R67RR157737R67RR237807NC7NN177827NC7NN137847NC7NN117837R62RR9862R60RR110870R60RR9870R60RR4880R60RR5890R60RR4890R60RR2900NC0NN6100NC0NN91001116100NC0NN9990R65oo125153NC3oo183123111163122R60RR100121R65oo7129R16oo6129R16oo5129R16oo226124NC4NN7125111115126111146127R67oo187128R70RR2119R60xx5136R60oo4350R09RR3359R09RR8147R64oo2141R02oo1145R64oo3134R09oo2120R65oo5135R60oo4370R09RR3379R09RR7144R02oo2142R02oo1146R64oo3139NC9NN2117R62RR1117R62RR1140R60RR3118R65RR2118R65RR1119R60xx7143R02oo1120R65oo1116R02oo2116R02oo182452R77RR197467R77RR177457R77RR4447R77RR117152NC2oo102152NC2oo9151NC1oo3441R77RR2437R57oo147727R62oo132722R62oo8712R09oo7719R09oo169749R77RR5747R77RR137164NC4NN124774R68oo118758R68oo108758R68oo8768R68oo7768R68oo6788R68oo5163R60RR6810NC0NN120850R60RR8920R60RR69109999930R67oo3130R65oo2130R65oo1130R65oo105945R67oo7967R67oo117957R09oo99999222228148R64oo5115R70RR100156R01oo9156R01oo201461R77RR1437R57oo107155R70oo9155R70ooo390333120970R64RR134131NC1NN4981R64RR5114R02ooo167R60RRR162R60RRR162R60RRR7R77RRR8R67RRR9R18RRR7R77RRR8R67RRR9R18RRR4R77RRR5R67RRR6R18RRR4R77RRR5R67RRR6R18RRR162R60RRR165R60RRR168R67RRR169NC9NN269269R60RR250260R60RR3250R60RR290270R60RR280270R60RR2250R60RR3280R60RR5230R60RR4230R60RR8240R60RR7240R60RR5220R60RR4220R60RR8210R60RR7210R60RR4280R60RR5280R60RR220290R60RR210290R60RR200290R60RR140300R67RR157307R67RR167307R67RR217157R67RR207157R67RR8167R67RR9167R67RR3147R67RR1137R67RR4147R67RR2137R67RR177127R67RRR60170R67RR157177R67RR157117R67RR147117R67RR157187R67RR167127R67RR167187R67RR177187R67RR9197R67RR8197R67RR107197R67RR1207R67RR2207R67RR3207R67RR7317R09RR8319R09RR5329R09RR6329R09RR7349R09RR8349R09RR5339R09RR6339R09RR4609R77RR5607R77RR6607R77RR307547R77RR1517R77RR4527R77RR277537R77RR237577R77RR247577R77RR2557R77RR1557R77RR137567R77RR5567R77RR167597R77RR177597R77RR2587R77RR1587R77RR9607R77RR8607R77RR7607R77RR247647R16RR196636R16RR126626R16RR6656R16RR7616R16RR136666R16RR196676R16RR4686R16RR146696R16RR3706R16RR8706R16RR7706R16RR=`  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~">@,y,'`,BQj  XHHHH@@;;a`lptx| ":RjJ*b @vXXXXXX`XXXhXXXpXX Xx  Unit # Chan. 1 Chan. 2 Chan. 3 Chan. 4 Color 1 Color 2 Color 3 Color 4 Dim.1 Dim.2 Dim.3 Dim.4 C' 4a[=StripAe @$=StripUnit #e @,=StripChan. 1e @(=StripChan. 2e @(=Strip Chan. 3e =StripChan. 4e @(=StripColor 1e @$=StripColor 2e @(=StripColor 3e =Strip Color 4e =Strip$Dim.1e =Strip(Dim.2e =Strip,Dim.3e =Strip0Dim.4e y,pAd;;@@dx@@;;a`^`;;a@^`0 ;@@ $y,'`4<CA "&*.26:>BFJPV\`dhlptx|  $(,06<BFLRX\`dhlrx~ "&*06:>BFJNRVZ^bhlrv|71233R77R67R18RRRRR61233R77R67R18RRRRR51233R77R67R18RRRRR31233R77R67R18RRRRR11233R77R67R18RRRRR1581041051061R77R67R57RRRRR31011021031R77R67R57RRRRR61071081091R77R67R57RRRRR1071101111121R77R67R57RRRRR81101111121R77R67R57RRRRRR507487444444444444974774444444444416611661R60RR60RRRRRR16611661R60RR60RRRRR@=` ">@y,'`8/A Position YomUnit # YChannelU  PurposeS`UColorateS`r%CCircuit YDimmerS` Wattage|1#0 Type $"$Template $z( Short Purpp ,Miscl#1!"p0Miscl#2*!"pZ0A4444444444444Ty,3@UnU(:'`@'`ty,'`L1@ {Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This Macro replaces selected lights with the currently selected} {symbol, retaining the original database info} PROCEDURE ReplaceSymbol; var SymbolObjects:Array[1..50] of Handle; ObjHandle: Handle; LayerHandle:Handle; Ok:boolean; SymbolName:string; SymRot:Real; X,Y:Real; Index:integer; Unit,Pos,Cir,Chan,Color,Dim,Watt,Type,Temp:string; Purp,ShortPurp,Misc1,Misc2,SymName:string; StringNumber:string; {--------------------------------------------------------------} PROCEDURE FillSymbolArray; VAR objectHandle:Handle; stringNumber:string; BEGIN FOR Index:=1 to 25 DO SymbolObjects[Index]:=NIL; Index:=0; LayerHandle:=ActLayer; objectHandle:=FSObject(LayerHandle); WHILE objectHandle<>NIL DO BEGIN IF (GetType(objectHandle)=15) THEN BEGIN Index:=Index+1; SymbolObjects[Index]:=objectHandle; END; {IF ((GetType(ObjHandle)=15)} objectHandle:=NextSObj(objectHandle); END; {WHILE objectHandle<>NIL} DSelectAll; Message('Leaving FillSymbolArray'); END; {PROCEDURE FillSymbolArray} {--------------------------------------------------------------} PROCEDURE PickUpDataStrings(objectHandle:Handle); BEGIN Unit:=EvalStr(objectHandle,('Lights'.'Unit #')); Pos:=EvalStr(objectHandle,('Lights'.'Position')); Chan:=EvalStr(objectHandle,('Lights'.'Channel')); Purp:=EvalStr(objectHandle,('Lights'.'Purpose')); Color:=EvalStr(objectHandle,('Lights'.'Color')); Cir:=EvalStr(objectHandle,('Lights'.'Circuit')); Dim:=EvalStr(objectHandle,('Lights'.'Dimmer')); { Watt:=EvalStr(objectHandle,('Lights'.'Wattage')); use new symbol data } { Type:=EvalStr(objectHandle,('Lights'.'Type')); use new symbol data } Temp:=EvalStr(objectHandle,('Lights'.'Template')); ShortPurp:=EvalStr(objectHandle,('Lights'.'Short Purp')); Misc1:=EvalStr(objectHandle,('Lights'.'Miscl#1')); Misc2:=EvalStr(objectHandle,('Lights'.'Miscl#2')); SymName:=GetName(objectHandle); END; {Procedure PickUpDataStrings} {--------------------------------------------------------------} PROCEDURE PutDownDataStrings; VAR objectHandle:Handle; BEGIN objectHandle:= LNewObj; SetRField(objectHandle,'Lights', 'Unit #', Unit); SetRField(objectHandle,'Lights', 'Position', Pos); SetRField(objectHandle,'Lights', 'Channel', Chan); SetRField(objectHandle,'Lights', 'Purpose', Purp); SetRField(objectHandle,'Lights', 'Color', Color); SetRField(objectHandle,'Lights', 'Circuit', Cir); SetRField(objectHandle,'Lights', 'Dimmer', Dim); { SetRField(objectHandle,'Lights', 'Wattage', Watt); use new symbol data } { SetRField(objectHandle,'Lights', 'Type', Type); use new symbol data } SetRField(objectHandle,'Lights', 'Template', Temp); SetRField(objectHandle,'Lights', 'Short Purp', ShortPurp); SetRField(objectHandle,'Lights', 'Miscl#1', Misc1); SetRField(objectHandle,'Lights', 'Miscl#2', Misc2); IF SymName<>'none' THEN SetName(ObjHandle,SymName); END; {PROCEDURE PutDownDataStrings} {--------------------------------------------------------------} BEGIN {* DoMenu(1387, NoKey); *} SetCursor(WatchC); ObjHandle:=ActSymDef; SymbolName:=GetSDName(ObjHandle); IF SymbolName<>'' THEN BEGIN FillSymbolArray; Index:=1; WHILE ((SymbolObjects[Index]<>NIL) AND (Index<26)) DO BEGIN ObjHandle:=SymbolObjects[Index]; PickUpDataStrings(ObjHandle); GetSymLoc(ObjHandle,X,Y); SymRot:= GetSymRot(ObjHandle); DelObject(ObjHandle); Symbol(SymbolName, X, Y, SymRot); PutDownDataStrings; Index:=Index+1; END; {WHILE ((SymbolObjects[Index]<>NIL)} END {IF SymbolName<>''} ELSE AlrtDialog('No New Symbol is active'); ClrMessage; SetCursor(ArrowC); END; {PROCEDURE ReplaceSymbol} Run(ReplaceSymbol); ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;A Wy,'`1@ 1{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This macro was developed by Richard Yopung at AOL and modified by me} PROCEDURE Leader; LABEL 1; VAR x, y, x1, y1, X2, Y2, S: REAL; h: handle; theDistance:REAL; theKey:integer; WasCancelled:boolean; Units:Real; Frac,DispAcc:longint; Format:integer; Upi:real; UnitMk,SqrUnitMk:string; MStyle:integer; MSize:Real; MAngle:integer; PROCEDURE EnterLabelString; VAR LabelString: string; BEGIN Message('Start Typing'); IF (x > x1) then TextJust(3) ELSE TextJust(1); LabelString := StrDialog('Enter Text String', '?'); IF DidCancel THEN WasCancelled := TRUE ELSE BEGIN WasCancelled := FALSE; Pensize(1); TextSize(10); FillPat(1); TextOrigin(x2 - (0.0625*Upi) * S, y2 + (0.0625*Upi) * S); BeginText; LabelString EndText; END; END; { PROCEDURE Call } BEGIN FMarker(MStyle,MSize,MAngle); GetUnits( Frac,DispAcc,Format,Upi,UnitMk,SqrUnitMk); DoMenuText('Show/Snap/Modify Others'); h := ActLayer; S := GetLScale(h); DSelectall; Layer('Notes'); NameClass('LeaderNote'); REPEAT Message('Pick arrow loc., Double Click to END'); GetPt(x,y); IF KeyDown(theKey) then theDistance := 0 ELSE BEGIN Message('Click on hinge point'); GetPtl(x, y, x1, y1); theDistance := Distance(x, y, x1, y1); IF theDistance > (0.5*Upi) then BEGIN BeginGroup; PenSize(1); Marker(1,.2,15); { ArrowHead(1); } PenPat(2); { ArrowSize(10); } MoveTo(x, y); LineTo(x1, y1); Message('Click to Enter Text Call Out'); Moveto(x1, y1); GetPtl(x1, y1, x2, y2); Marker(0,0,0); { ArrowHead(0); } MoveTo(x1, y1); LineTo(x2, y2); EndGroup; EnterLabelString; { PROCEDURE EnterLabelString } IF WasCancelled THEN DeleteObjs ELSE DSelectall; END; { IF theDistance > 0.5} ClrMessage; END; {ELSE} UNTIL ((theDistance < (0.5*Upi)) or WasCancelled); 1: Layer(GetLName(h)); NameClass('None'); DoMenuText('Show Others'); DSelectAll; ClrMessage; Marker(MStyle,MSize,MAngle); { ArrowSize(5); } { ArrowHead(8); } FillPat(0); SetCursor(ArrowC); SetTool(-128); {2D Cursor} ClrMessage; END; Run(Leader); ny,;Any,;An;A (y,'`1@ {Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE CtrHBump; VAR ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; RealX, RealY:REAL; FirstX,SecondX:REAL; ArcX,ArcY:REAL; ObjX, ObjY:REAL; TwoferType:Integer; TwoferY:REAL; DX:REAL; NumOfVerts:Integer; NumOfObjs:Integer; MessString:string; X1Array: array[1..10] of REAL; Y1Array: array[1..10] of REAL; X2Array: array[1..10] of REAL; Y2Array: array[1..10] of REAL; Index,Index1,Index2:Integer; TopX,TopY,BottomX,BottomY:REAL; DummyX,DummyY:REAL; Units:Real; Frac,DispAcc:longint; Format:integer; Upi:real; UnitMk,SqrUnitMk:string; BEGIN GetUnits( Frac,DispAcc,Format,Upi,UnitMk,SqrUnitMk); LayerHandle := ActLayer; NumOfObjs := NumSObj(LayerHandle); SetCursor(WatchC); IF NumOfObjs < 2 THEN BEGIN ObjHandle:=FSObject(LayerHandle); IF ObjHandle <> NIL THEN BEGIN NumOfVerts:=GetVertNum(ObjHandle); TwoferType:=GetType(ObjHandle); Message('Click on Center of gap'); GetPt(ArcX,ArcY); FirstX := ArcX - (2.5 * Upi); SecondX := ArcX + (2.5 * Upi); Index1 := 1; Index2 := 1; NameClass('Twofer'); {if not a line} IF TwoferType=5 THEN BEGIN GetPolyPt(ObjHandle,2, DummyX, ArcY); FOR Index:=1 to NumOfVerts DO BEGIN GetPolyPt(ObjHandle,Index,RealX,RealY); IF (RealX < FirstX) THEN BEGIN X1array[Index1] := RealX; Y1array[Index1] := RealY; Index1 := Index1 + 1; END ELSE {RealX >= FirstX} BEGIN Index2 := Index2 + 1; X2array[Index2] := RealX; Y2array[Index2] := RealY; END; END; {FOR Index:=1 to NumOfVerts} X1array[Index1] := FirstX; Y1array[Index1] := ArcY; X2array[1] := SecondX; Y2array[1] := ArcY; DeleteObjs; MoveTo(X1array[1],Y1array[1]); FOR Index:=2 to Index1 DO LineTo(X1array[Index],Y1array[Index]); MoveTo(X2array[1],Y2array[2]); FOR Index:=2 to Index2 DO LineTo(X2array[Index],Y2array[Index]); END {IF NumOfVerts > 0} ELSE {is just a line} BEGIN Message('Is a line'); NumOfVerts := 2; GetSegPt1( ObjHandle, X1array[1], Y1array[1]); X1array[2] := FirstX; Y1array[2] := Y1array[1]; ArcY:=Y1array[1]; GetSegPt2( ObjHandle, X2array[1], Y2array[1]); X2array[2] := SecondX; Y2array[2] := Y2array[1]; DeleteObjs; MoveTo(X1array[1],Y1array[1]); LineTo(X1array[2],Y1array[2]); MoveTo(X2array[1],Y2array[1]); LineTo(X2array[2],Y2array[2]); END; FillPat(0); TopX := FirstX; TopY := ArcY + 2.5 * Upi); BottomX := SecondX; BottomY := ArcY - (2.5 * Upi); Arc(TopX,TopY,BottomX,BottomY,#0,#-180); MoveBack; DSelectAll; ReDraw; END {IF ObjHandle <> NIL} ELSE AlrtDialog('Must Select a twofer segment first'); END {IF NumOfObjs < 2} ELSE AlrtDialog('Select only ONE twofer segment on which to place the bump'); NameClass('None'); ClrMessage SetCursor(ArrowC); END; Run(CtrHBump); ny,;An;A[y,'`1@5{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} Procedure ZoomSpecific; var ZoomPercent:integer; Begin ZoomPercent:=IntDialog('Percent Magnification', '100'); SetCursor(WatchC); SetZoom(ZoomPercent); SetCursor(ArrowC); End; Run(ZoomSpecific); ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;Ay,'`81@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE CtrVBump; VAR ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; RealX, RealY:REAL; FirstY,SecondY:REAL; ArcX,ArcY:REAL; ObjX, ObjY:REAL; TwoferType:Integer; DX:REAL; NumOfVerts:Integer; NumOfObjs:Integer; MessString:string; X1Array: array[1..10] of REAL; Y1Array: array[1..10] of REAL; X2Array: array[1..10] of REAL; Y2Array: array[1..10] of REAL; Index,Index1,Index2:Integer; TopX,TopY,BottomX,BottomY:REAL; DummyX,DummyY:REAL; Units:Real; Frac,DispAcc:longint; Format:integer; Upi:real; UnitMk,SqrUnitMk:string; BEGIN GetUnits( Frac,DispAcc,Format,Upi,UnitMk,SqrUnitMk); LayerHandle := ActLayer; NumOfObjs := NumSObj(LayerHandle); SetCursor(WatchC); IF NumOfObjs < 2 THEN BEGIN ObjHandle:=FSObject(LayerHandle); IF ObjHandle <> NIL THEN BEGIN NumOfVerts:=GetVertNum(ObjHandle); TwoferType:=GetType(ObjHandle); Message('Click on Center of gap'); GetPt(ArcX,ArcY); FirstY := ArcY + (2.5 * Upi); SecondY := ArcY - (2.5 * Upi); Index1 := 1; Index2 := 1; NameClass('Twofer'); IF TwoferType=5 THEN {is an open polygon} BEGIN GetPolyPt(ObjHandle,2, ArcX, DummyY); FOR Index:=1 to NumOfVerts DO BEGIN GetPolyPt(ObjHandle,Index,RealX,RealY); IF (RealY > FirstY) THEN BEGIN X1array[Index1] := RealX; Y1array[Index1] := RealY; Index1 := Index1 + 1; END ELSE {RealY <= FirstY} BEGIN Index2 := Index2 + 1; X2array[Index2] := RealX; Y2array[Index2] := RealY; END; END; {FOR Index:=1 to NumOfVerts} X1array[Index1] := ArcX; Y1array[Index1] := FirstY; X2array[1] := ArcX; Y2array[1] := SecondY; DeleteObjs; REDRAW; MoveTo(X1array[1],Y1array[1]); FOR Index:=2 to Index1 DO BEGIN LineTo(X1array[Index],Y1array[Index]); END; MoveTo(X2array[1],Y2array[1]); FOR Index:=2 to Index2 DO BEGIN LineTo(X2array[Index],Y2array[Index]); END; END {IF NumOfVerts > 0} {is just a line} ELSE BEGIN GetSegPt1( ObjHandle, RealX,RealY); ArcX := RealX; Oval( RealX - (2 * Upi), RealY + (2 * Upi), RealX + (2 * Upi), RealY - (2 * Upi)); IF (RealY > FirstY) THEN BEGIN X1array[1] := RealX; Y1array[1] := RealY; X1array[2] := RealX; Y1array[2] := FirstY; END ELSE BEGIN X2array[1] := RealX; Y2array[1] := SecondY; X2array[2] := RealX; Y2array[2] := RealY; END; GetSegPt2( ObjHandle, RealX,RealY); Oval( RealX - (4 * Upi), RealY + (4 * Upi), RealX + (4 * Upi), RealY - (4 * Upi)); IF (RealY > FirstY) THEN BEGIN X1array[1] := RealX; Y1array[1] := RealY; X1array[2] := RealX; Y1array[2] := FirstY; END ELSE BEGIN X2array[1] := RealX; Y2array[1] := SecondY; X2array[2] := RealX; Y2array[2] := RealY; END; DeleteObjs; MoveTo(X1array[1],Y1array[1]); LineTo(X1array[2],Y1array[2]); MoveTo(X2array[1],Y2array[1]); LineTo(X2array[2],Y2array[2]); END; FillPat(0); TopX:= ArcX + (2.5 * Upi); TopY:=FirstY; BottomX:= ArcX - (2.5 * Upi); BottomY:=SecondY; Arc(TopX,TopY,BottomX,BottomY, #90,#180); MoveBack; DSelectAll; ReDraw; END {IF ObjHandle <> NIL} ELSE AlrtDialog('Must Select a twofer segment first'); END {IF NumOfObjs < 2} ELSE AlrtDialog('Select only ONE twofer segment on which to place the bump'); NameClass('None'); ClrMessage SetCursor(ArrowC); END; {CtrVBump} Run(CtrVBump); ny,;Any,;An;A y,'`H1@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This macro will align selected lighting units vertically according to their insertion points} PROCEDURE AlignLightsLR; VAR ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; RealX, RealY:REAL; ObjX, ObjY:REAL; DX:REAL; OriginX:REAL; OriginY:REAL; BEGIN GetOrigin(OriginX,OriginY); Message('Click on point to align to'); { GetPt(RealX,RealY); } SetCursor(LgCrossC); REPEAT UNTIL MouseDown( RealX,RealY); RealX:= RealX - OriginX; RealY:= RealY - OriginY; LayerHandle:=FLayer; WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN GetSymLoc(ObjHandle,ObjX,ObjY); DX:=RealX-ObjX; Hmove(ObjHandle,DX,0) END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} Redraw; ClrMessage; END; {Procedure AlignLightsLR} {---------------------------------------------------------} Run(AlignLightsLR); ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;AJy,'`l1@${Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This macro will align selected lighting units vertically according to their insertion points} PROCEDURE AlignLightsTB; VAR ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; RealX, RealY:REAL; ObjX, ObjY:REAL; DY:REAL; OriginX:REAL; OriginY:REAL; TheKey:Integer; BEGIN GetOrigin(OriginX,OriginY); TheKey := 0; Message('Click on point to align to'); { GetPt(RealX,RealY); } SetCursor(LgCrossC); REPEAT UNTIL (MouseDown(RealX,RealY) OR KeyDown(TheKey)); IF TheKey = 0 THEN BEGIN RealX:= RealX - OriginX; RealY:= RealY - OriginY; LayerHandle:=FLayer; WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN GetSymLoc(ObjHandle,ObjX,ObjY); DY:=RealY-ObjY; Hmove(ObjHandle,0,DY) END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} Redraw; END; {IF TheKey <> 0} ClrMessage; END; {PROCEDURE AlignLightsTB} Run(AlignLightsTB); ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;Ay,'`1@h{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This macro allows you to specify an old position name and a new position} {name.It will then find all the instruments with the old name and replace that} {old name with the new name. If it is convenient to select all the desired} {units, he task can be accomplished more quickly by entering the new name in} {the Data Tab of the Info Window} PROCEDURE ChangePositionName; VAR ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; NumberOfLights:integer; RealHolder:REAL; StringHolder:string; Ok:boolean; PositionStr:string; NewPositionStr:string; PositionMatch:string; item:integer; BEGIN PositionStr:=StrDialog('Enter Old Position Description',''); IF ((NOT DidCancel) and (PositionStr<>'')) THEN BEGIN NewPositionStr:=StrDialog('Enter New Position Description','PIPE 1'); SetCursor(WatchC); Message('Changing Position Descriptions'); NumberOfLights:=0; LayerHandle:=FLayer; WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FInLayer(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch:=EvalStr(ObjHandle,('Lights'.'Position' = positionStr)); IF PositionMatch='True' THEN BEGIN SetRField(ObjHandle,'Lights', 'Position', NewPositionStr); END; {IF PositionMatch='True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(ObjHandle)=15} ObjHandle:=NextObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} ClrMessage; SysBeep; SetCursor(ArrowC); END; {IF PositionStr<>''} END; {Procedure ChangePositionName} RUN(ChangePositionName); ny,;Any,;An;Ay,'`D1@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} Procedure Credits; {===================================================} PROCEDURE MakDlog; var item:integer; msgStr1:string; msgStr2:string; msgStr3:string; msgStr4:string; msgStr5:string; msgStr6:string; msgStr7:string; msgStr8:string; CR:string; { AddField(fieldStr:STRING;itemID, fieldType,x1,y1,x2,y2:INTEGER); } BEGIN item:=1; CR:=Chr(13); BeginDialog(1,2,100,50,550,500); AddButton('OK',1,1, 104,380,182,400); msgStr1:='Macros Developed by Samuel L. Jones'; msgStr2:='in consultation with Stan Pressner & Craig Miller'; msgStr7:='Symbols by Craig Miller & Stan Pressner'; msgStr3:='Copyright June 1993'; msgStr4:='Version 14.5'; msgStr6:= concat(msgStr1, CR, msgStr2,CR,msgStr7,CR,msgStr3,CR,msgStr4); AddField(msgStr6, 2,1,28,4,350,90); msgStr8:='Leadered Label macro by Richard Yopung at AOL'; msgStr5:='Beamspread macro improved by Joshua Benghiat'; msgStr6:= concat(msgStr8,CR,msgStr5); AddField(msgStr6, 3,1,28,100,350,135); msgStr6:='If they are useful - send $25 to the address below or Diamonds & Gems for my lovely wife Celeste'; AddField(msgStr6, 4,1,28,145,350,190); msgStr1:='For support and input'; msgStr2:='Samuel L. Jones'; msgStr3:='12130 Ohio Ave. #306'; msgStr4:='Los Angeles, CA 90025'; msgStr6:=concat(msgStr1,CR, msgStr2, CR, msgStr3, CR, msgStr4); AddField(msgStr6, 5, 1, 56,195,280,290); msgStr1:='Phone: (310) 825-5823(w)'; msgStr2:=' (310) 207-0392(h)'; msgStr3:='sjones@arts.ucla.edu'; msgStr4:='AOL: AutoPlot'; msgStr6:=concat(msgStr1,CR,msgStr2, CR, msgStr3, CR, msgStr4); AddField(msgStr6, 6, 1, 28,290,262,368); EndDialog; END; {Procedure MakDlog} {===================================================} PROCEDURE ShowCredits; VAR item:integer; BEGIN MakDlog; GetDialog(1); REPEAT DialogEvent(item); UNTIL (item=1) ; ClrDialog; END; {Procedure ShowCredits} {===================================================} BEGIN { Procedure Credits} ShowCredits; END; {Procedure Credits} Run(Credits); n;Ay,1@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This Procedure DELETES any light whose position field has a string length less than 2. This is mainly usefull for getting rid of artifacts that might be in your plot from the legend or similar operations} PROCEDURE DeleteUpositioned; VAR ObjHandle:Handle; LayerHandle:Handle; index:integer; RealX,RealY:REAL; NumberOfLights:integer; PositionStr:String; HandleArray:array[1..100] of Handle; BEGIN PositionStr:='Are you SURE you want to do this DANGEROUS thing'; IF YNDialog(PositionStr) THEN BEGIN SetCursor(WatchC); Message('Deleting Unpositioned Lights'); FOR index := 1 to 100 DO HandleArray[index] := NIL; NumberOfLights:=0; LayerHandle:=FLayer; WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FInLayer(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF ((GetRecord(ObjHandle,1)<>NIL)) THEN BEGIN PositionStr:=EvalStr(ObjHandle,('Lights'.'Position')); IF LEN(PositionStr) < 2 THEN BEGIN NumberOfLights := NumberOfLights + 1; HandleArray[NumberOfLights]:=ObjHandle; END; {IF LEN(PositionStr) < 2} END; {IF GetType(ObjHandle)=15} ObjHandle:=NextObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} index := 1; WHILE ((index<101) and (HandleArray[index] <> NIL)) DO BEGIN DelObject( HandleArray[index]); index := index + 1; END; {WHILE HandleArray[index] <> nil} RedrawAll; SetCursor(ArrowC); ClrMessage; END; {IF YNDialog(PositionStr)} END; {Procedure DeleteUpositioned} RUN(DeleteUpositioned); y,'`H1@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This macro is different from entering data in the Data Window, because it} {will query each light individually for each selected light. BE CAREFULL.} {The macro does not use postion number order. It uses the order in the data} {base (usually creation order).} PROCEDURE EnterDataForSelected; var ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; NumberOfLights:integer; RealHolder, RealX, RealY:REAL; StringHolder:string; Ok:boolean; PositionStr:string; PositionMatch:string; item:integer; {===================================================} PROCEDURE FillArray; var count:integer; BEGIN NumberOfLights:=0; ObjHandle:=FSActLayer; IF ObjHandle<>NIL THEN BEGIN LayerHandle:=FLayer; WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN NumberOfLights:=NumberOfLights+1; GetSymLoc(ObjHandle,RealX,RealY); XArray[NumberOfLights]:=RealX; HandleArray[NumberOfLights]:=ObjHandle; END; {IF (RecHandle<>NIL)} END; {IF GetType(ObjHandle)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END; {IF ObjHandle<>NIL} END; {PROCEDURE FillArray} {===================================================} PROCEDURE SortArray; var index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; noChange:boolean; cirString:string; realHolder:REAL; BEGIN noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO BEGIN IF XArray[index1]XArray[index2]} END; {FOR index2:=index1+1 to NumberOfLights} {FOR index1:=1 to NumberOfLights-1} END; {PROCEDURE SortArray} {===================================================} PROCEDURE MakDlog; var item:integer; BEGIN item:=1; BEGINDialog(1,1,22,30,317,365); AddButton('Enter',1,1,188,309,246,329); AddButton('Finished',2,1,34,309,92,329); AddField('Unit#:',3,1,14,6,89,22); AddField('Position:',4,1,14,29,89,45); AddField('Channel:',5,1,14,52,89,68); AddField('Short Purp:',6,1,14,75,89,91); AddField('Type:',7,1,14,98,89,114); AddField('Circuit:',8,1,14,122,89,137); AddField('Color:',9,1,14,145,89,160); AddField('Dimmer:',10,1,14,168,89,183); AddField('Purpose:',11,1,14,191,89,206); AddField('Wattage:',12,1,14,214,89,229); AddField('Template:',13,1,14,237,89,252); AddField('Miscl#1:',14,1,14,260,89,275); AddField('Miscl#2:',15,1,14,283,89,298); AddField('#',16,2,94,6,283,22); AddField('Position',17,2,94,29,283,45); AddField('Cha',18,2,94,52,283,68); AddField('Short P',19,2,94,75,283,91); AddField('unittype',20,2,94,98,283,114); AddField('Cir',21,2,94,122,283,137); AddField('color',22,2,94,145,283,160); AddField('dim',23,2,94,168,283,183); AddField('purp',24,2,94,191,283,206); AddField('watt',25,2,94,214,283,229); AddField('temp',26,2,94,237,283,252); AddField('Misc1',27,2,94,260,283,275); AddField('Misc2',28,2,94,283,283,298); ENDDialog; END; {PROCEDURE MakDlog} {===================================================} PROCEDURE QueryValues; const unitfld=16; posfld=17; chanfld=18; shortfld=19; typefld=20; cirfld=21; colorfld=22; dimfld=23; purpfld=24; wattfld=25; tempfld=26; misc1fld=27; misc2fld=28; Var index:integer; item:integer; realIndex:REAL; stringHolder:string; pos,unit,cir,chan,color,dim,purp,short, temp,misc1,misc2,unittype,watt:string; handleHolder:Handle; BEGIN MakDlog; GetDialog(1); FOR index:=1 to NumberOfLights DO BEGIN realIndex:=index; unit:=EvalStr(HandleArray[index],('Lights'.'Unit #')); SetField(unitfld,unit); pos:=EvalStr(HandleArray[index],('Lights'.'Position')); SetField(posfld,pos); cir:=EvalStr(HandleArray[index],('Lights'.'Circuit')); SetField(cirfld,cir); chan:=EvalStr(HandleArray[index],('Lights'.'Channel')); SetField(chanfld,chan); short:=EvalStr(HandleArray[index],('Lights'.'Short Purp')); SetField(shortfld,short); color:=EvalStr(HandleArray[index],('Lights'.'Color')); SetField(colorfld,color); dim:=EvalStr(HandleArray[index],('Lights'.'Dimmer')); SetField(dimfld,dim); purp:=EvalStr(HandleArray[index],('Lights'.'Purpose')); SetField(purpfld,purp); temp:=EvalStr(HandleArray[index],('Lights'.'Template')); SetField(tempfld,temp); misc1:=EvalStr(HandleArray[index],('Lights'.'Miscl#1')); SetField(misc1fld,misc1); misc2:=EvalStr(HandleArray[index],('Lights'.'Miscl#2')); SetField(misc2fld,misc2); unittype:=EvalStr(HandleArray[index],('Lights'.'Type')); SetField(typefld,unittype); watt:=EvalStr(HandleArray[index],('Lights'.'Wattage')); SetField(wattfld,watt); SelField(unitfld); item:=0; REPEAT DialogEvent(item); UNTIL ((item=1) or (item=2)); unit:=GetField(unitfld); SetRField(HandleArray[index],'Lights', 'Unit #', unit); pos:=GetField(posfld); SetRField(HandleArray[index],'Lights', 'Position', pos); cir:=GetField(cirfld); SetRField(HandleArray[index],'Lights', 'Circuit', cir); chan:=GetField(chanfld); SetRField(HandleArray[index],'Lights', 'Channel', chan); short:=GetField(shortfld); SetRField(HandleArray[index],'Lights', 'Short Purp', short); color:=GetField(colorfld); SetRField(HandleArray[index],'Lights', 'Color', color); dim:=GetField(dimfld); SetRField(HandleArray[index],'Lights', 'Dimmer', dim); purp:=GetField(purpfld); SetRField(HandleArray[index],'Lights', 'Purpose', purp); temp:=GetField(tempfld); SetRField(HandleArray[index],'Lights', 'Template', temp); misc1:=GetField(misc1fld); SetRField(HandleArray[index],'Lights', 'Miscl#1', misc1); misc2:=GetField(misc2fld); SetRField(HandleArray[index],'Lights', 'Miscl#2', misc2); unittype:=GetField(typefld); SetRField(HandleArray[index],'Lights', 'Type', unittype); watt:=GetField(wattfld); SetRField(HandleArray[index],'Lights', 'Wattage', watt); IF item=2 THEN index:=NumberOfLights END; {FOR index:=1 to NumberOfLights} ClrDialog; END; {PROCEDURE QueryValues} {===================================================} BEGIN Message('Filling Array'); FillArray; Message('SortArray'); SortArray; Message('QueryValues'); QueryValues; MoveObjs(2,0,true,true); MoveObjs(-2,0,true,true); ClrMessage; END; Run(EnterDataForSelected); ny,;Any,;Any,;An;Ay,'`d1@v{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This Macro duplicates the function of entering a new position in the} {in the Data window, but it does it more slowly. Oh well.} PROCEDURE EnterPositionOfSelected; var ObjHandle:Handle; LayerHandle:Handle; Ok:boolean; StringHolder:string; PositionStr:string; BEGIN LayerHandle:=FLayer; ObjHandle:=FSObject(LayerHandle); StringHolder:=EvalStr(ObjHandle, ('Lights'.'Position')); PositionStr:=StrDialog('Enter Position Description',''); IF (NOT DidCancel) THEN BEGIN WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF ((GetType(ObjHandle)=15) AND (GetRecord(ObjHandle,1)<>NIL)) THEN SetRField(ObjHandle,'Lights','Position',PositionStr); ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END { IF (NOT DidCancel)} ELSE SetRField(ObjHandle,'Lights','Position',StringHolder); SysBeep; END; {PROCEDURE EnterPositionOfSelected} Run(EnterPositionOfSelected); ny,;Any,;Any,;Any,;Any,;An;A y,'`|1@ x{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE Legend; VAR LayerHandle:Handle; ObjHandle:Handle; NumberOfLights:Integer; Index:Integer; Cnt:Integer; LegendX,LegendY:Real; CurrentName:string; RotationAng:Real; SymbolNameHolder:string; SymbolNames:array[1..25] of string; LegendNames:array[1..25] of string; AlreadyThere:boolean; DoIt:boolean; Units:Real; Frac,DispAcc:longint; Format:integer; Upi:real; UnitMk,SqrUnitMk:string; BEGIN GetUnits( Frac,DispAcc,Format,Upi,UnitMk,SqrUnitMk); DoIt:=YNDialog('Will delete all text attached to a class that is not in a symbol. OK ?'); IF DoIt THEN BEGIN MESSAGE('Select Upper Left Corner of Legend'); GetPt(LegendX,LegendY); SetCursor(WatchC); SelectObj((T=Symbol)); NumberOfLights:=0; Cnt:=0; LayerHandle:=FLayer; WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN Cnt:=Cnt+1; Message(concat('Fixture #',Num2Str(0,Cnt))); SymbolNameHolder:=GetSymName(ObjHandle); IF Pos('FRES',SymbolNameHolder)>0 THEN CurrentName:=Copy(SymbolNameHolder, 1, Pos('FRES',SymbolNameHolder) + 3) ELSE IF Pos('X',SymbolNameHolder)>0 THEN BEGIN If Pos(' ',SymbolNameHolder)>0 THEN CurrentName:=Copy(SymbolNameHolder,1,Pos(' ',SymbolNameHolder)-1) ELSE CurrentName:=Copy(SymbolNameHolder,1,4); END ELSE IF Pos('SOURCE',SymbolNameHolder)>0 THEN CurrentName:=Copy(SymbolNameHolder,1,10) ELSE CurrentName:=SymbolNameHolder; AlreadyThere:=FALSE; FOR Index:=1 to NumberOfLights DO BEGIN IF Pos(CurrentName, LegendNames[Index])>0 THEN AlreadyThere:=TRUE; END;{FOR Index:=1 to NumberOfLights} IF NOT AlreadyThere THEN BEGIN NumberOfLights:=NumberOfLights+1; LegendNames[NumberOfLights]:=CurrentName; {AlrtDialog(Concat('SymbolNameHolder = ',SymbolNameHolder));} SymbolNames[NumberOfLights]:=SymbolNameHolder; END;{IF NOT AlreadyThere} ObjHandle:=NextSObj(ObjHandle); END;{WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END;{WHILE LayerHandle<>NIL} DselectAll Message('past collection routine'); TextSize(12); MoveTo(LegendX,LegendY); FOR Index:=1 to NumberOfLights DO BEGIN RotationAng:=270; IF Pos('>',SymbolNames[Index])>0 THEN RotationAng:=0; IF Pos('/',SymbolNames[Index])>0 THEN RotationAng:=315; IF Pos('bl',SymbolNames[Index])>0 THEN RotationAng:=90; IF Pos('DS',SymbolNames[Index])>0 THEN RotationAng:=90; IF Pos('boom',SymbolNames[Index])>0 THEN RotationAng:=180; Symbol(SymbolNames[Index], LegendX, LegendY-((18*Upi)*(Index-1)),RotationAng); DoMenuText('Symbol to Group'); Ungroup; END; DSelectAll; SelectObj((C<>'None') & (T=Text)); DeleteObjs; FOR Index:=1 to NumberOfLights DO BEGIN MoveTo(LegendX+(24*Upi),LegendY-((18*Upi)*(Index-1))+(2*Upi)); BeginText; LegendNames[Index] EndText; END; MoveObjs(10,0,FALSE,TRUE); MoveObjs(-10,0,FALSE,TRUE); REDRAW; SetCursor(ArrowC); ClrMessage; END; END;{PROCEDURE Legend} RUN(Legend); n;AUy,'`1@/{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {Added by MsM 5/27/98 will accept CYC, XRAY, FOOTLIGHT and STRIP} {in the Symbol Name} {This PROCEDURE will number the selected units from stage left in groups. i.e. 1.1, 1.2, 1.3, 2.1, 2.2, 2.3} {IMPORTANT....The selected units MUST BE IN THE ACTIVE LAYER} {This routine does not allow the use of "0" as a starting position value. This is so that the cancel button will cancel. (Cancel returns the default value)} PROCEDURE Number3CirStrips; VAR ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; NumberOfLights:integer; UnitNumber:integer; Ok:boolean; PositionStr:string; PositionMatch:string; X1,Y1,X2,Y2:REAL; {---------------------------------------------------------} PROCEDURE GetObjectPosition(VAR theObject:Handle); VAR positStr:string; object:Handle; BEGIN PositionStr:=EvalStr(theObject,('Lights'.'Position')); Ok:=YNDialog(Concat('Position is ',PositionStr)); IF (not ok) THEN theObject:=NIL ELSE UnitNumber:=IntDialog('Start at what number', '1'); END; {PROCEDURE GetObjectPosition} {---------------------------------------------------------} PROCEDURE FillArray(positionOk:boolean); VAR index:integer; RealX,RealY:REAL; ok:boolean; messageNum:REAL; messageStr:string; BEGIN NumberOfLights:=0; ObjHandle:=FSActLayer; WHILE ((GetType(ObjHandle)<>15) AND (ObjHandle<>NIL) AND (GetRecord(ObjHandle,1)=NIL)) DO ObjHandle:=NextSObj(ObjHandle); GetObjectPosition(ObjHandle); IF ObjHandle<>NIL THEN BEGIN SetCursor(WatchC); positionOk:=True; LayerHandle:=FLayer; ObjHandle:=FSObject(LayerHandle); WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch:=EvalStr(ObjHandle,('Lights'.'Position')); IF PositionMatch=PositionStr THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:=RealX; END; {IF PositionMatch='True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END {IF ObjHandle<>NIL} ELSE positionOk:=False; END; {PROCEDURE FillArray} {---------------------------------------------------------} PROCEDURE SortArray; VAR index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; noChange:boolean; BEGIN noChange:=True; FOR index1:=1 to NumberOfLights-1 DO BEGIN FOR index2:=index1+1 to NumberOfLights DO BEGIN IF XArray[index1]XArray[index2]} END; {FOR index2:=index1+1 to NumberOfLights} END; {FOR index1:=1 to NumberOfLights-1} END; {PROCEDURE SortArray} {---------------------------------------------------------} PROCEDURE AssignPositionValues; VAR index:integer; isStrip:integer; realIndex:REAL; fraction:REAL; stringHolder:string; handleHolder:Handle; keyThing:integer; thing:boolean; BEGIN fraction:=0; IF UnitNumber <> 0 THEN BEGIN UnitNumber:=UnitNumber-1; fraction:=0.34; FOR index:=1 to NumberOfLights DO BEGIN IF index=1 THEN HCenter(HandleArray[index], X1,Y1); IF index=NumberOfLights THEN HCenter(HandleArray[index], X2,Y2); ObjHandle:=HandleArray[index]; stringHolder:=GetSymName(ObjHandle); UprString(stringHolder); isStrip:=Pos('CYC', stringHolder); IF isStrip=0 THEN isStrip:=Pos('STRIP', stringHolder); IF isStrip=0 THEN {These two lines added 5/27/98 by MsM} isStrip:=Pos('XRAY', stringHolder); IF isStrip=0 THEN {These two lines added 5/27/98 by MsM} isStrip:=Pos('FOOTLIGHT', stringHolder); IF isStrip>0 THEN BEGIN fraction:=fraction+0.1; IF fraction>0.34 THEN BEGIN fraction:=0.1; UnitNumber:=UnitNumber+1; END; realIndex:=UnitNumber + fraction; stringHolder:=Num2Str(1,realIndex); END {IF isStrip>0} ELSE BEGIN UnitNumber:=UnitNumber+1; stringHolder:=Num2Str(0,UnitNumber); END; SetRField(HandleArray[index],'Lights','Unit #',stringHolder); END; {FOR index:=1 to NumberOfLights} END; END; {PROCEDURE AssignPositionValues} {---------------------------------------------------------} BEGIN Message('FINDING LIGHTS'); Ungroup; FillArray(Ok); IF Ok THEN BEGIN Message('SORTING LIGHTS'); SortArray; Message('ASSIGNING NUMBERS'); AssignPositionValues; END; ClrMessage; {THE FOLLOWING IS USED TO GET MC TO REDRAW} {ONLY THE RENUMBERED ITEMS} MoveObjs(2,0,true,true); MoveObjs(-2,0,true,true); Redraw SetCursor(ArrowC); SysBeep; END; {PROCEDURE Number3CirStrips;} Run(Number3CirStrips); ny,;Any,;Any,;An;Ay,'`1@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {Added by MsM 5/27/98 will accept CYC, XRAY, FOOTLIGHT and STRIP} {in the Symbol Name} {This PROCEDURE will number the selected units from stage left in groups. i.e. 1.1, 1.2, 1.3, 1.4, 2.1, 2.2, 2.3, 2.4} {IMPORTANT....The selected units MUST BE IN THE ACTIVE LAYER} {This routine does not allow the use of "0" as a starting position value. This is so that the cancel button will cancel. (Cancel returns the default value)} PROCEDURE Number4CirStrips; VAR ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; NumberOfLights:integer; UnitNumber:integer; Ok:boolean; PositionStr:string; PositionMatch:string; X1,Y1,X2,Y2:REAL; {---------------------------------------------------------} PROCEDURE GetObjectPosition(VAR theObject:Handle); VAR positStr:string; object:Handle; BEGIN PositionStr := EvalStr(theObject,('Lights'.'Position')); Ok := YNDialog(Concat('Position is ',PositionStr)); IF (not ok) THEN theObject := NIL ELSE UnitNumber := IntDialog('Start at what number', '1'); End; {PROCEDURE GetObjectPosition} {---------------------------------------------------------} PROCEDURE FillArray(positionOk:boolean); VAR index:integer; RealX,RealY:REAL; ok:boolean; messageNum:REAL; messageStr:string; BEGIN NumberOfLights := 0; ObjHandle := FSActLayer; WHILE ((GetType(ObjHandle)<>15) AND (ObjHandle<>NIL) AND (GetRecord(ObjHandle,1)=NIL)) DO ObjHandle := NextSObj(ObjHandle); GetObjectPosition(ObjHandle); IF ObjHandle<>NIL THEN BEGIN SetCursor(WatchC); positionOk := True; LayerHandle := FLayer; ObjHandle := FSObject(LayerHandle); WHILE LayerHandle<>NIL DO BEGIN ObjHandle := FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle) = 15 THEN BEGIN RecHandle := GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch := EvalStr(ObjHandle,('Lights'.'Position')); IF PositionMatch = PositionStr THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights := NumberOfLights + 1; HandleArray[NumberOfLights] := ObjHandle; XArray[NumberOfLights] := RealX; END; {IF PositionMatch = 'True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(x) = 15} ObjHandle := NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle := NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END {IF ObjHandle<>NIL} ELSE positionOk := False; END; {PROCEDURE FillArray} {---------------------------------------------------------} PROCEDURE SortArray; VAR index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; noChange:boolean; BEGIN noChange := True; FOR index1 := 1 to NumberOfLights - 1 DO FOR index2 := index1 + 1 to NumberOfLights DO BEGIN IF XArray[index1]XArray[index2]} END; {FOR index2 := index1 + 1 to NumberOfLights} {FOR index1 := 1 to NumberOfLights - 1} END; {PROCEDURE SortArray} {---------------------------------------------------------} PROCEDURE AssignPositionValues; VAR index:integer; isStrip:integer; realIndex:REAL; fraction:REAL; stringHolder:string; handleHolder:Handle; keyThing:integer; thing:boolean; BEGIN fraction := 0; IF UnitNumber <> 0 THEN BEGIN UnitNumber := UnitNumber - 1; fraction := 0.4; FOR index := 1 to NumberOfLights DO BEGIN IF index = 1 THEN HCenter(HandleArray[index], X1,Y1); IF index = NumberOfLights THEN HCenter(HandleArray[index], X2,Y2); ObjHandle := HandleArray[index]; stringHolder := GetSymName(ObjHandle); UprString(stringHolder); isStrip := Pos('CYC', stringHolder); IF isStrip = 0 THEN isStrip := Pos('STRIP', stringHolder); IF isStrip=0 THEN {These two lines added 5/27/98 by MsM} isStrip:=Pos('XRAY', stringHolder); IF isStrip=0 THEN {These two lines added 5/27/98 by MsM} isStrip:=Pos('FOOTLIGHT', stringHolder); IF isStrip>0 THEN BEGIN fraction := fraction + 0.1; IF fraction>0.4 THEN BEGIN fraction := 0.1; UnitNumber := UnitNumber + 1; END; realIndex := UnitNumber + fraction; stringHolder := Num2Str(1,realIndex); END {IF isStrip>0} ELSE BEGIN UnitNumber := UnitNumber + 1; stringHolder := Num2Str(0,UnitNumber); END; SetRField(HandleArray[index],'Lights','Unit #',stringHolder); END; {FOR index := 1 to NumberOfLights} END; END; {PROCEDURE AssignPositionValues} {---------------------------------------------------------} BEGIN Message('FINDING LIGHTS'); Ungroup; FillArray(Ok); IF Ok THEN BEGIN Message('SORTING LIGHTS'); SortArray; Message('ASSIGNING NUMBERS'); AssignPositionValues; END; ClrMessage; {THE FOLLOWING IS USED TO GET MC TO REDRAW} {ONLY THE RENUMBERED ITEMS} MoveObjs(2,0,true,true); MoveObjs(-2,0,true,true); Redraw; SetCursor(ArrowC); SysBeep; END; {PROCEDURE Number4CirStrips;} Run(Number4CirStrips); n;Ay,'`1@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE NumberDStoUS; VAR ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; YArray:array[1..100] of REAL; NumberOfLights:integer; UnitNumber:integer; Ok:boolean; PositionStr:string; PositionMatch:string; MsgStr:string; X1,Y1,X2,Y2:REAL; {---------------------------------------------------------} PROCEDURE GetObjectPosition(VAR theObject:Handle); VAR positStr:string; object:Handle; BEGIN PositionStr := EvalStr(theObject,('Lights'.'Position')); Ok := YNDialog(Concat('Position is ',PositionStr)); IF (not ok) THEN theObject := NIL ELSE UnitNumber := IntDialog('Start at what number', '1'); END; {PROCEDURE GetObjectPosition} {---------------------------------------------------------} PROCEDURE FillArray(VAR positionOk:boolean); VAR index:integer; RealX,RealY:REAL; ok:boolean; messageNum:REAL; messageStr:string; BEGIN NumberOfLights := 0; ObjHandle := FSActLayer; WHILE ((GetType(ObjHandle)<>15) AND (ObjHandle<>NIL) AND (GetRecord(ObjHandle,1)=NIL)) DO ObjHandle := NextSObj(ObjHandle); GetObjectPosition(ObjHandle); IF ObjHandle<>NIL THEN BEGIN SetCursor(WatchC); positionOk := True; LayerHandle := FLayer; ObjHandle := FSObject(LayerHandle); WHILE LayerHandle<>NIL DO BEGIN ObjHandle := FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle := GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch := EvalStr(ObjHandle,('Lights'.'Position')); IF PositionMatch=PositionStr THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights := NumberOfLights + 1; HandleArray[NumberOfLights] := ObjHandle; XArray[NumberOfLights] := RealX; YArray[NumberOfLights] := RealY; END; {IF PositionMatch='True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle := NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle := NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END {IF ObjHandle<>NIL} ELSE positionOk := False; END; {PROCEDURE FillArray} {---------------------------------------------------------} PROCEDURE SortArray; VAR index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; yHolder:LongInt; noChange:boolean; units:Real; frac,dispAcc:longint; format:integer; upi:real; unitMk,sqrUnitMk:string; BEGIN GetUnits(frac,dispAcc,format,upi,unitMk,sqrUnitMk); noChange := True; FOR index1 := 1 to NumberOfLights - 1 DO FOR index2 := index1 + 1 to NumberOfLights DO BEGIN Message(concat('index1=',Num2Str(0,index1), 'index2=',Num2Str(0,index2))); IF (YArray[index1]>YArray[index2] - (6*upi)) THEN BEGIN objectHolder := HandleArray[index2]; xHolder := XArray[index2]; yHolder := YArray[index2]; HandleArray[index2] := HandleArray[index1]; XArray[index2] := XArray[index1]; YArray[index2] := YArray[index1]; HandleArray[index1] := objectHolder; XArray[index1] := xHolder; YArray[index1] := yHolder; NoChange := False; END; {IF (YArray[index1]NIL DO BEGIN ObjHandle := FInLayer(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle := GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch := EvalStr(ObjHandle,('Lights'.'Position')); IF PositionMatch=PositionStr THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights := NumberOfLights + 1; HandleArray[NumberOfLights] := ObjHandle; XArray[NumberOfLights] := RealX; END; {IF PositionMatch='True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle := NextObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle := NextLayer(LayerHandle); END; {WHILE LayerHanel<>NIL} END; {PROCEDURE FillArray} {---------------------------------------------------------} PROCEDURE SortArray; VAR index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; noChange:boolean; BEGIN noChange := True; FOR index1 := 1 to NumberOfLights - 1 DO FOR index2 := index1 + 1 to NumberOfLights DO BEGIN IF XArray[index1]XArray[index2]} END; {FOR index2 := index1 + 1 to NumberOfLights} {FOR index1 := 1 to NumberOfLights - 1} END; {PROCEDURE SortArray} {---------------------------------------------------------} PROCEDURE AssignPositionValues; VAR index:integer; realIndex:REAL; stringHolder:string; handleHolder:Handle; BEGIN FOR index := 1 to NumberOfLights DO BEGIN realIndex := index; stringHolder := Num2Str(0,realIndex); SetRField(HandleArray[index],'Lights','Unit #',stringHolder); SetSelect(HandleArray[index]); END; {FOR index := 1 to NumberOfLights} END; {PROCEDURE AssignPositionValues} {---------------------------------------------------------} BEGIN {NumberUnitsAtPosition} PositionStr := StrDialog('Enter Position Description',''); IF ((NOT DidCancel) AND (PositionStr<>'')) THEN BEGIN SetCursor(WatchC); Message('FINDING LIGHTS'); FillArray(PositionStr); Message('SORTING LIGHTS'); SortArray; Message('ASSIGNING NUMBERS'); AssignPositionValues; {The following is required to force MC to redraw the renumbered instruments because - redraw - is not triggered by changes to the database} MoveObjs(2,0,true,true); MoveObjs(-2,0,true,true); ClrMessage; SysBeep; SetCursor(ArrowC); END; {IF ((NOT DidCancel) AND (PositionStr<>''))} END; {PROCEDURE NumberUnitsAtPosition} Run(NumberUnitsAtPosition); ny,;Any,;An;Ay,'`1@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This Procedure will number the selected units from stage left} {This routine does not allow the use of "0" as a starting position value. This is so that the cancel button will cancel. (Cancel returns the default value)} Procedure NumberSelectedUnits; var ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; NumberOfLights:integer; UnitNumber:integer; Ok:boolean; PositionStr:string; PositionMatch:string; X1,Y1,X2,Y2:REAL; {---------------------------------------------------------} Procedure GetObjectPosition(var theObject:Handle); Var positStr:string; object:Handle; Begin PositionStr := EvalStr(theObject,('Lights'.'Position')); Ok := YNDialog(Concat('Position is ',PositionStr)); IF (not ok) THEN theObject := NIL ELSE UnitNumber := IntDialog('Start at what number', '1'); End; {Procedure GetObjectPosition} {---------------------------------------------------------} Procedure FillArray(positionOk:boolean); Var index:integer; RealX,RealY:REAL; ok:boolean; messageNum:REAL; messageStr:string; Begin NumberOfLights := 0; ObjHandle := FSActLayer; WHILE ((GetType(ObjHandle)<>15) AND (ObjHandle<>NIL) AND (GetRecord(ObjHandle,1) = NIL)) DO ObjHandle := NextSObj(ObjHandle); GetObjectPosition(ObjHandle); IF ObjHandle<>NIL THEN BEGIN SetCursor(WatchC); positionOk := True; LayerHandle := FLayer; ObjHandle := FSObject(LayerHandle); WHILE LayerHandle<>NIL DO BEGIN ObjHandle := FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle) = 15 THEN BEGIN RecHandle := GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch := EvalStr(ObjHandle,('Lights'.'Position')); IF PositionMatch = PositionStr THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights := NumberOfLights + 1; HandleArray[NumberOfLights] := ObjHandle; XArray[NumberOfLights] := RealX; END; {IF PositionMatch = 'True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(x) = 15} ObjHandle := NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle := NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END {IF ObjHandle<>NIL} ELSE positionOk := False; End; {Procedure FillArray} {---------------------------------------------------------} Procedure SortArray; var index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; noChange:boolean; Begin noChange := True; FOR index1 := 1 to NumberOfLights - 1 DO BEGIN FOR index2 := index1 + 1 to NumberOfLights DO BEGIN IF XArray[index1]XArray[index2]} END; {FOR index2 := index1 + 1 to NumberOfLights} END; {FOR index1 := 1 to NumberOfLights - 1} END; {Procedure SortArray} {---------------------------------------------------------} PROCEDURE AssignPositionValues; VAR index:integer; realIndex:REAL; stringHolder:string; handleHolder:Handle; BEGIN IF UnitNumber <> 0 THEN FOR index := 1 to NumberOfLights DO BEGIN IF index = 1 THEN HCenter(HandleArray[index], X1,Y1); IF index = NumberOfLights THEN HCenter(HandleArray[index], X2,Y2); realIndex := (UnitNumber + index - 1); stringHolder := Num2Str(0,realIndex); SetRField(HandleArray[index],'Lights','Unit #',stringHolder); END; {FOR index := 1 to NumberOfLights} END; {Procedure AssignPositionValues} {---------------------------------------------------------} begin Message('FINDING LIGHTS'); FillArray(Ok); IF Ok THEN BEGIN Message('SORTING LIGHTS'); SortArray; Message('ASSIGNING NUMBERS'); AssignPositionValues; END; {The following is required to force MC to redraw the renumbered instruments because - redraw - is not triggered by changes to the database} MoveObjs(0,24,true,true); MoveObjs(0,-24,true,true); SetCursor(ArrowC); REDRAW; ClrMessage; SysBeep; end; {Procedure NumberSelectedUnits} Run(NumberSelectedUnits); ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;A~y,'`h1@X{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE NumberSLBoom; VAR ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; YArray:array[1..100] of REAL; NumberOfLights:integer; UnitNumber:integer; Ok:boolean; PositionStr:string; PositionMatch:string; MsgStr:string; X1,Y1,X2,Y2:REAL; {---------------------------------------------------------} Procedure GetObjectPosition(var theObject:Handle); Var positStr:string; object:Handle; Begin PositionStr := EvalStr(theObject,('Lights'.'Position')); Ok := YNDialog(Concat('Position is ',PositionStr)); IF (not ok) THEN theObject := NIL ELSE UnitNumber := IntDialog('Start at what number', '1'); End; {Procedure GetObjectPosition} {---------------------------------------------------------} PROCEDURE FillArray(VAR positionOk:boolean); VAR index:integer; RealX,RealY:REAL; ok:boolean; messageNum:REAL; messageStr:string; BEGIN NumberOfLights:=0; ObjHandle:=FSActLayer; WHILE ((GetType(ObjHandle)<>15) AND (ObjHandle<>NIL) AND (GetRecord(ObjHandle,1)=NIL)) DO ObjHandle:=NextSObj(ObjHandle); GetObjectPosition(ObjHandle); IF ObjHandle<>NIL THEN BEGIN SetCursor(WatchC); positionOk:=True; LayerHandle:=FLayer; ObjHandle:=FSObject(LayerHandle); WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch:=EvalStr(ObjHandle,('Lights'.'Position')); IF PositionMatch=PositionStr THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:=RealX; YArray[NumberOfLights]:=RealY; END; {IF PositionMatch='True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END {IF ObjHandle<>NIL} ELSE positionOk:=False; END; {PROCEDURE FillArray} {---------------------------------------------------------} PROCEDURE SortArray; VAR index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; yHolder:LongInt; noChange:boolean; units:Real; frac,dispAcc:longint; format:integer; upi:real; unitMk,sqrUnitMk:string; BEGIN GetUnits(frac,dispAcc,format,upi,unitMk,sqrUnitMk); noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO BEGIN Message(concat('index1=',Num2Str(0,index1), 'index2=',Num2Str(0,index2))); IF (YArray[index1]15) AND (ObjHandle<>NIL) AND (GetRecord(ObjHandle,1)=NIL)) DO ObjHandle:=NextSObj(ObjHandle); GetObjectPosition(ObjHandle); IF ObjHandle<>NIL THEN BEGIN SetCursor(WatchC); positionOk:=True; LayerHandle:=FLayer; ObjHandle:=FSObject(LayerHandle); WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch:=EvalStr(ObjHandle,('Lights'.'Position')); IF PositionMatch=PositionStr THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:=RealX; YArray[NumberOfLights]:=RealY; END; {IF PositionMatch='True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END {IF ObjHandle<>NIL} ELSE positionOk:=False; END; {PROCEDURE FillArray} {---------------------------------------------------------} PROCEDURE SortArray; VAR index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; yHolder:LongInt; noChange:boolean; units:Real; frac,dispAcc:longint; format:integer; upi:real; unitMk,sqrUnitMk:string; BEGIN GetUnits(frac,dispAcc,format,upi,unitMk,sqrUnitMk); noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO BEGIN Message(concat('index1=',Num2Str(0,index1), 'index2=',Num2Str(0,index2))); IF (YArray[index1]15) AND (ObjHandle<>NIL) AND (GetRecord(ObjHandle,1)=NIL)) DO ObjHandle:=NextSObj(ObjHandle); GetObjectPosition(ObjHandle); IF ObjHandle<>NIL THEN BEGIN SetCursor(WatchC); positionOk:=True; LayerHandle:=FLayer; ObjHandle:=FSObject(LayerHandle); WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch:=EvalStr(ObjHandle,('Lights'.'Position')); IF PositionMatch=PositionStr THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:=RealX; YArray[NumberOfLights]:=RealY; END; {IF PositionMatch='True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END {IF ObjHandle<>NIL} ELSE positionOk:=False; END; {PROCEDURE FillArray} {---------------------------------------------------------} PROCEDURE SortArray; VAR index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; yHolder:LongInt; noChange:boolean; units:Real; frac,dispAcc:longint; format:integer; upi:real; unitMk,sqrUnitMk:string; BEGIN GetUnits(frac,dispAcc,format,upi,unitMk,sqrUnitMk); noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO BEGIN Message(concat('index1=',Num2Str(0,index1), 'index2=',Num2Str(0,index2))); IF (YArray[index1]NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN GetSymLoc(ObjHandle, realX,realY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:= realX; Message(concat('number of lights = ',Num2Str(0,NumberOfLights))); END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END; {PROCEDURE FillArray} {---------------------------------------------------------} PROCEDURE SortArray; VAR index1:integer; index2:integer; objectHolder:Handle; xHolder:REAL; yHolder:REAL; noChange:boolean; BEGIN noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO BEGIN IF XArray[index1]NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN GetSymLoc(ObjHandle, realX,realY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:= realX; Message(concat('number of lights = ',Num2Str(0,NumberOfLights))); END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END; {PROCEDURE FillArray} {---------------------------------------------------------} PROCEDURE SortArray; var index1:integer; index2:integer; objectHolder:Handle; xHolder:REAL; yHolder:REAL; noChange:boolean; BEGIN noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO BEGIN IF XArray[index1] < XArray[index2] THEN BEGIN objectHolder:=HandleArray[index2]; xHolder:=XArray[index2]; HandleArray[index2]:=HandleArray[index1]; XArray[index2]:=XArray[index1]; HandleArray[index1]:=objectHolder; XArray[index1]:=xHolder; NoChange:=False; END; {IF XArray[index1]<=XArray[index2]} END; {FOR index2:=index1+1 to NumberOfLights} {FOR index1:=1 to NumberOfLights-1} END; {PROCEDURE SortArray} {---------------------------------------------------------} PROCEDURE MoveLights; VAR index:integer; BEGIN FOR index:=1 to NumberOfLights DO BEGIN GetSymLoc( HandleArray[index],X,Y); DeltaX:=DestX-(X+((index -1) * Space)); HMove( HandleArray[index], DeltaX,0); END; {FOR index:=1 to NumberOfLights} END; {PROCEDURE MoveLights} {---------------------------------------------------------} BEGIN { SpaceFromSL} DlgDist := 0; WSHan := GetObject('AutoPlot Preferences'); IF WSHan = NIL THEN BEGIN AlrtDialog('No AutoPlot Preferences worksheet found. MACRO ABORTED. Run Make Prefs macro'); GOTO 9; END; IF (CellHasNum(WSHan,kFixtureSpacing,2)) THEN DlgDist := GetCellNUM(WSHan,kFixtureSpacing,2); Space := RealDialog('Spacing in inches (if metric use drawing units', Num2Str(0,DlgDist)); Space:=ABS(Space); IF (DidCancel OR (Space = 0)) THEN GOTO 9; SelectSS(WSHan); LoadCell(kFixtureSpacing,2,Num2Str(0,Space)); CloseSS(WSHan); Message('Click on point to align to'); GetPt(DestX,DestY); SetCursor(WatchC); Message('Filling Array'); FillArray; Message('Sorting Array'); SortArray; Message('Moving Lights'); MoveLights; ClrMessage; Redraw; SysBeep; SetCursor(ArrowC); 9: CloseSS(WSHan); END; {PROCEDURE SpaceFromSL} RUN( SpaceFromSL); ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;A y,'`@1@ {Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE SpaceFromTop; LABEL 9; CONST kFixtureSpacing = 9; VAR DlgDist:REAL; WSHan:HANDLE; ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; YArray:array[1..100] of REAL; NumberOfLights:INTEGER; Space:REAL; Spread:REAL; X:REAL; Y:REAL; DestX:REAL; DestY:REAL; DeltaY:REAL; Ok:boolean; PositionStr:string; PositionMatch:string; {---------------------------------------------------------} PROCEDURE FillArray; VAR index:integer; realX,realY:REAL; ok:boolean; messageNum:REAL; messageStr:string; BEGIN NumberOfLights:=0; LayerHandle:=FLayer; WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN GetSymLoc(ObjHandle, realX,realY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; YArray[NumberOfLights]:= realY; END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END; {PROCEDURE FillArray} {---------------------------------------------------------} PROCEDURE SortArray; VAR index1:integer; index2:integer; objectHolder:Handle; yHolder:REAL; noChange:boolean; BEGIN noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO BEGIN IF YArray[index1]NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN GetSymLoc(ObjHandle,realX,realY); NumberOfLights:=NumberOfLights+1; UnitID[NumberOfLights]:=ObjHandle; UnitLoc[NumberOfLights,1]:=realX; UnitLoc[NumberOfLights,2]:=realY; IF NOT FirstUnitFound THEN BEGIN FirstUnitFound:=TRUE; HighX:=realX; RightUnit:=ObjHandle; LowX:=realX; LeftUnit:=ObjHandle; HighY:=realY; TopUnit:=ObjHandle; LowY:=realY; BottomUnit:=ObjHandle; END ELSE IF realX > HighX THEN BEGIN HighX:=realX; RightUnit:=ObjHandle; END ELSE IF realX < LowX THEN BEGIN LowX:=realX; LeftUnit:=ObjHandle END; IF realY >= HighY THEN BEGIN HighY:=realY; TopUnit:=ObjHandle; END; IF realY < LowY THEN BEGIN LowY:=realY; BottomUnit:=ObjHandle; END; END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} End; {PROCEDURE FillPositionArray} {========================================} PROCEDURE HorizOrVert; VAR aStr, bStr:String; BEGIN Horiz:=FALSE; Vert:=FALSE; IF Abs(HighX-LowX)>Abs(HighY-LowY) THEN BEGIN IF CmdKey THEN Vert:=TRUE ELSE Horiz:=TRUE; END ELSE BEGIN IF CmdKey THEN Horiz:=TRUE ELSE Vert:=TRUE; END; END; {PROCEDURE HorizOrVert} {========================================} PROCEDURE MakeHORIZConnection; VAR index:integer; x1,x2,x3,x4,y1,y2,y3,y4:REAL; BEGIN DSelectAll; GetSymLoc(LeftUnit,x1,y1); GetSymLoc(RightUnit,x4,y4); x2:=x1; y2:=TwoferY; x3:=x4; y3:=TwoferY; FillPat(0); Poly(x1,y1,x2,y2,x3,y3,x4,y4); MoveBack; { DoMenu(1458,NoKey); } IF NumberOfLights > 2 THEN BEGIN FOR index:=1 to NumberOfLights DO BEGIN IF ((UnitID[index]<>LeftUnit) AND (UnitID[index]<>RightUnit)) THEN BEGIN MoveTo(UnitLoc[index,1],UnitLoc[index,2]); LineTo(UnitLoc[index,1],TwoferY); MoveBack; { DoMenu(1458,NoKey); } END; END; {FOR index:=1 to NumberOfLights } END; {IF NumberOfLights > 2 } END; {PROCEDURE MakeHORIZConnection} {========================================} PROCEDURE MakeVERTConnection; VAR index:integer; x1,x2,x3,x4,y1,y2,y3,y4:REAL; BEGIN DSelectAll; GetSymLoc(TopUnit,x1,y1); GetSymLoc(BottomUnit,x4,y4); x2:=TwoferX; y2:=y1; x3:=TwoferX; y3:=y4; PenPat(2); FillPat(0); Poly(x1,y1,x2,y2,x3,y3,x4,y4); MoveBack; { DoMenu(1458,NoKey); } IF NumberOfLights > 2 THEN BEGIN FOR index:=1 to NumberOfLights DO BEGIN IF ((UnitID[index]<>TopUnit) AND (UnitID[index]<>BottomUnit)) THEN BEGIN MoveTo(UnitLoc[index,1],UnitLoc[index,2]); LineTo(TwoferX,UnitLoc[index,2]); MoveBack; { DoMenu(1458,NoKey); } END; END; {FOR index:=1 to NumberOfLights } END; {IF NumberOfLights > 2 } END; {PROCEDURE MakeVERTConnection} {========================================} BEGIN GetOrigin(OriginX,OriginY); ObjHandle:=FSActLayer; IF ObjHandle <> NIL THEN BEGIN FillPositionArray; Message('Select position for connecting line'); { GetPt(TwoferX,TwoferY); } SetCursor(LgCrossC); REPEAT UNTIL MouseDown(TwoferX,TwoferY); TwoferX := TwoferX - OriginX; TwoferY := TwoferY - OriginY; { AlrtDialog(concat('TwoferY = ',Num2Str(2,TwoferY),' OriginY = ',Num2Str(2, OriginY))); } CmdKey := Option; SetCursor(WatchC); HorizOrVert; NameClass('Twofer'); IF Horiz THEN MakeHORIZConnection ELSE IF Vert THEN MakeVERTConnection ELSE AlrtDialog('The connecting line must be above, below, right, or left of all selected lights. Not in the middle'); END {IF ObjHandle <> NIL } ELSE {ObjHandle = NIL} BEGIN AlrtDialog('You must select the lights you wish to twofer first'); END; {ELSE ObjHandle = NIL} NameClass('None'); Redraw SetCursor(ArrowC); ClrMessage; END; {PROCEDURE TwoferLights} Run(TwoferLights); ny,;Any,;Any,;Any,;Any,;Any,;Any,;An;A3y,'`1@ {Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE WriteData; VAR ExportFile:Text; FileName:STRING; ObjHandle:Handle; LayerHandle:Handle; NumberOfLights:integer; RealNumber:Real; Index:integer; UnNamedSymbols:integer; Counter:integer; CounterHolder:REAL; CounterStr:String; X,Y:real; XStr,YStr:String; UnitStr,PosStr,TypeStr,WattStr,CirStr,ChanStr,TempStr:STRING; ColorStr,FunStr,DimStr,ShortStr,Miscl1Str,Miscl2Str:STRING; OutputStr:STRING; theNameStr:STRING; AlrtStr1,AlrtStr2,AlrtStr3:string; AlrtNum1,AlrtNum2,AlrtNum3:real; Procedure FillStrings; BEGIN UnitStr:=EvalStr(ObjHandle, ('Lights'.'Unit #')); PosStr:=EvalStr(ObjHandle, ('Lights'.'Position')); IF len(PosStr)<2 THEN PosStr:=concat('(x=',XStr,') (y=',YStr,')'); TypeStr:=EvalStr(ObjHandle, ('Lights'.'Type')); WattStr:=EvalStr(ObjHandle, ('Lights'.'Wattage')); CirStr:=EvalStr(ObjHandle, ('Lights'.'Circuit')); ChanStr:=EvalStr(ObjHandle, ('Lights'.'Channel')); ColorStr:=EvalStr(ObjHandle, ('Lights'.'Color')); FunStr:=EvalStr(ObjHandle, ('Lights'.'Purpose')); TempStr:=EvalStr(ObjHandle, ('Lights'.'Template')); DimStr:=EvalStr(ObjHandle, ('Lights'.'Dimmer')); ShortStr:=EvalStr(ObjHandle, ('Lights'.'Short Purp')); Miscl1Str:=EvalStr(ObjHandle, ('Lights'.'Miscl#1')); Miscl2Str:=EvalStr(ObjHandle, ('Lights'.'Miscl#2')); Index:=Index+1; theNameStr := GetName(ObjHandle); IF ValidNumStr(theNameStr,CounterHolder) THEN BEGIN IF (CounterHolder < 0) THEN BEGIN CounterStr:=Num2Str(0,Counter); SetName(ObjHandle,CounterStr); OutputStr:=concat('#',UnitStr,' ',PosStr,' (new - ',Num2Str(0,Index),' name(',CounterStr, ')'); Counter:=Counter-1; END {IF (CounterStr < 0)} ELSE BEGIN {CounterHolder >= 0} CounterStr:=theNameStr; OutputStr:=concat('#',UnitStr,' ',PosStr,' (old - ',Num2Str(0,Index),' name(',CounterStr, ')'); END; {Else CounterStr>=0} END {IF ValidNumStr(theNameStr,CounterHolder)} ELSE IF ((theNameStr = 'none') OR (theNameStr = '')) THEN BEGIN CounterStr:=Num2Str(0,Counter); SetName(ObjHandle,CounterStr); OutputStr:=concat('#',UnitStr,' ',PosStr,' (new - ',Num2Str(0,Index),' name(',CounterStr, ')'); Counter:=Counter-1; END {ELSE IF (theNameStr = 'none')} ELSE BEGIN {theNameStr 'none'} CounterStr:=theNameStr; OutputStr:=concat('#',UnitStr,' ',PosStr,' (old - ',Num2Str(0,Index),' name(',CounterStr, ')'); END; {Else theNameStr 'none'} End; {Procedure FillStrings} {-------------------------------------------------------------} Procedure WriteOutput; Begin Write(UnitStr);{0} Tab(1); Write(PosStr); {1} Tab(1); Write(ChanStr); {2} Tab(1); Write(ShortStr); {3} Tab(1); Write(TypeStr); {4} Tab(1); Write(CirStr); {5} Tab(1); Write(ColorStr); {6} Tab(1); Write(DimStr); {7} Tab(1); Write(FunStr); {8} Tab(1); Write(WattStr); {9} Tab(1); Write(TempStr); {10} Tab(1); Write(Miscl1Str); {11} Tab(1); Write(Miscl2Str); {12} Tab(1); Writeln(CounterStr); {13} End; {Procedure WriteOutput} {-------------------------------------------------------------} BEGIN ExportFile:='Lights.export'; PutFile('Name file - Lights.export', 'Lights.export',ExportFile); IF NOT DidCancel THEN BEGIN SetCursor(WatchC); IF GetObject('NameCounter') = NIL THEN BEGIN TextSize(3); NameObject('NameCounter'); TextOrigin(0,0); BeginText; '32000' EndText; ObjHandle:=GetObject('NameCounter'); SetClass(ObjHandle,'CounterClass'); HideClass('CounterClass'); Counter:=32000; END ELSE BEGIN ObjHandle:=GetObject('NameCounter'); CounterStr := GetText(ObjHandle); Counter := Str2Num(CounterStr) - 1; HideClass('CounterClass'); END; Index:=0; SelectObj(R IN ['Lights']); LayerHandle:=FLayer; WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ((ObjHandle<>NIL) AND (NumRecords(ObjHandle)>0)) DO BEGIN FillStrings; Message(OutputStr); WriteOutput; ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} Close(ExportFile); ClrMessage; DSelectAll; ObjHandle := GetObject('NameCounter'); CounterStr := Num2Str(0,Counter); SetText(ObjHandle,CounterStr); SelectObj(((N='') & (T=Symbol) & ((R IN ['Lights'])))); LayerHandle:=ActLayer; UnNamedSymbols := 0; UnNamedSymbols := NumSObj(LayerHandle); IF UnNamedSymbols > 0 THEN BEGIN AlrtDialog('AutoPlot has attempted to assign a name that is already assigned.'); AlrtDialog('Run the "Erase Fixture IDs" macro and re-export'); END; END; {IF NOT DidCancel} SysBeep; SysBeep; ClrMessage; SetCursor(ArrowC); END; {PROCEDURE WriteData} Run(WriteData); ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;Afy,'`1@@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This macro reads data from a text file and inserts the data into the data base.} {The data must be in the Data Window order.} PROCEDURE ReadFile; CONST Backward=1; Forward=2; VAR ImportFile:Text; SymbolConflictFile:Text; FileName:STRING; ObjHandle:Handle; LayerHandle:Handle; NumberOfLights:integer; Index:integer; TypeErrorCount:integer; TypeConflict:array[1..20,1..3] of string; unitStr,posStr,typeStr,wattStr,cirStr,chanStr:STRING; colorStr,funStr,tempStr,dimStr,shortStr:STRING; miscl1Str,miscl2Str,linkStr,XStr,YStr:STRING; MaxLights:integer; Xcoor,Ycoor, Scrx1, Scry1, Scrx2, Scry2:REAL; LastName:REAL; {------------------------------------------------------------} PROCEDURE MakDlog; VAR item:integer; x1,x2,y1,y2:integer; BEGIN item:=1; BeginDialog(1,1,13,29,497,333); AddButton('OK',1,1,376,8,444,28); x1:=18; x2:=204; FOR item:= 2 TO 11 DO BEGIN y1:=((item-2)*24)+60; y2:=y1+16; AddField('',item,1,x1,y1,x2,y2); END; x1:=212; x2:=342; FOR item:= 12 TO 21 DO BEGIN y1:=((item-12)*24)+60; y2:=y1+16; AddField('',item,1,x1,y1,x2,y2); END; x1:=350; x2:=480; FOR item:= 22 TO 31 DO BEGIN y1:=((item-22)*24)+60; y2:=y1+16; AddField('',item,1,x1,y1,x2,y2); END; AddField('Position & Unit',32,1,18,36,146,52); AddField('Hook up type',33,1,212,36,342,52); AddField('Plot Symbol type',34,1,350,36,480,52); AddField('These units have conflicting type descriptions',35,1,16,8,324,28); EndDialog; END; {PROCEDURE MakDlog} {------------------------------------------------------------} PROCEDURE FillDataFields(theSymbol:Handle); VAR plotType:STRING; alertStr:STRING; plotType2:STRING; typeStr2:STRING; BEGIN {if theSymbol is of the TYPE symbol} IF GetType(theSymbol) = 15 THEN BEGIN plotType:=GetSymName(theSymbol); UprString(plotType); UprString(typeStr); {IF ((Pos(typeStr,plotType)>0) OR (Pos(plotType,typeStr)>0)) THEN} SetRField(theSymbol,'Lights','Type',typeStr) { ELSE }{incoming type does NOT match plot type} {BEGIN} {TypeErrorCount:=TypeErrorCount+1;} {IF TypeErrorCount<21 THEN} {BEGIN} {TypeConflict[TypeErrorCount,1]:=concat(posStr,' #',unitStr);} {TypeConflict[TypeErrorCount,2]:=typeStr;} {TypeConflict[TypeErrorCount,3]:=plotType;} {END} {ELSE} {TypeConflict[20,2]:='MORE THAN 20';} {END;} {ELSE [type does not match]} END; {F GetType(theSymbol) = 15} IF ((wattStr='-') OR (wattStr='0')) THEN wattStr:=''; IF ((cirStr='-') OR (cirStr='0')) THEN cirStr:=''; IF chanStr='-' THEN chanStr:=''; IF colorStr='-' THEN colorStr:=''; IF funStr='-' THEN funStr:=''; IF tempStr='-' THEN tempStr:=''; IF ((dimStr='-') OR (dimStr='0')) THEN dimStr:=''; IF shortStr='-' THEN shortStr:=''; IF miscl1Str='-' THEN miscl1Str:=''; IF miscl2Str='-' THEN miscl2Str:=''; SetRField(theSymbol,'Lights','Unit #',unitStr); SetRField(theSymbol,'Lights','Position',posStr); SetRField( theSymbol, 'Lights','Wattage',wattStr); SetRField( theSymbol, 'Lights','Circuit',cirStr); SetRField( theSymbol, 'Lights','Channel',chanStr); SetRField( theSymbol, 'Lights','Color',colorStr); SetRField( theSymbol, 'Lights','Purpose',funStr); SetRField( theSymbol, 'Lights','Template',tempStr); SetRField( theSymbol,'Lights','Dimmer',dimStr); SetRField( theSymbol,'Lights','Short Purp',shortStr); SetRField( theSymbol,'Lights','Miscl#1',miscl1Str); SetRField( theSymbol,'Lights','Miscl#2',miscl2Str); END; { PROCEDURE FillDataFields} {------------------------------------------------------------} PROCEDURE ReturnXY(unitHandle:Handle); VAR coorStr:STRING; BEGIN GetSymLoc(unitHandle,Xcoor,Ycoor); END; { PROCEDURE ReturnXY } {------------------------------------------------------------} PROCEDURE PlaceNewLight; VAR x,y,x1,y1,x2,y2:REAL; prevUnitNum,postUnitNum,unitNum : REAL; prevUnitStr,postUnitStr : STRING; prevUnit,postUnit,theUnit : Handle; theDistance:REAL; aChr:char; BEGIN unitNum := Str2Num(unitStr); prevUnitStr := Num2Str(0,(unitNum)); IF (Count(('Lights'.'Unit #' = prevUnitStr) and ('Lights'.'Position'= posStr)) < 1) THEN prevUnitStr := Num2Str(0,(unitNum-1)); postUnitStr := Num2Str(0,(unitNum + 1)); ForEachObject( ReturnXY, ('Lights'.'Unit #' = prevUnitStr)&('Lights'.'Position'= posStr)); x1 := Xcoor; y1 := Ycoor; ForEachObject( ReturnXY, ('Lights'.'Unit #' = postUnitStr)&('Lights'.'Position'= posStr)); x2 := Xcoor; y2 := Ycoor; theDistance := Distance(x1,y1,x2,y2); y := y2; IF (ABS(ABS(y2)-ABS(y1)) > (ABS(ABS(x2)-ABS(x1)))) THEN BEGIN y := y1 - (theDistance/2); x := x2; END ELSE BEGIN x := x1 - (theDistance/2); y := y2; END; Symbol('Generic Unit', x, y, 0); END; { PROCEDURE PlaceNewLight } {------------------------------------------------------------} PROCEDURE GetInfo; VAR index,index2:integer; unitHolder,posHolder:STRING; unitHandle:Handle; numberLeft:REAL; count:integer; plotType:STRING; msgStr:STRING; xcoor,ycoor:REAL; isNumber:boolean; BEGIN index:=0; count:=0; WHILE NOT EOF(ImportFile) DO BEGIN index:=index+1; count:=count+1; Readln(unitStr,posStr,chanStr,shortStr,typeStr,cirStr,colorStr, dimStr,funStr, wattStr,tempStr,miscl1Str, miscl2Str, linkStr); IF (linkStr='0') THEN BEGIN Message(concat('Importing New Light (',Num2Str(0,index),')')); PlaceNewLight; unitHandle:=LNewObj; FillDataFields(unitHandle); SetRField(unitHandle,'Lights','Type',typeStr); END {IF (linkStr='0')} ELSE IF (linkStr<>'IGNORE') THEN BEGIN Message(concat('Importing Light #',Num2Str(0,index),' #',linkStr)); ForEachObject(FillDataFields,N=linkStr); isNumber := ValidNumStr(linkStr,LastName); END; {ELSE IF UprString(linkStr)<>'IGNORE'} END; {WHILE EOF(ImportFile) DO} Close(ImportFile); Message('END File Read'); IF TypeConflict[1,1]<>'' THEN BEGIN Message('Before MakDlog'); MakDlog; GetDialog(1); FOR Index:= 2 to 11 DO BEGIN SetField(index,TypeConflict[Index-1,1]); SetField(index+10,TypeConflict[Index-1,2]); SetField(index+20,TypeConflict[Index-1,3]); IF TypeConflict[Index-1,1]='' THEN Index:=11; END;{FOR Index:= 2 to 11} REPEAT DialogEvent(Index); UNTIL (Index=1); ClrDialog; SymbolConflictFile:='Symbol Conflicts'; PutFile('SAVE Symbol Conflicts File', 'Symbol Conflicts', SymbolConflictFile); IF NOT DidCancel THEN BEGIN Write('Position & Unit#'); Tab(1); Write('Hookup Type'); Tab(1); Writeln('Plot Symbol Type'); FOR Index:=1 to 20 DO BEGIN Write(TypeConflict[Index,1]); Tab(1); Write(TypeConflict[Index,2]); Tab(1); Writeln(TypeConflict[Index,3]); END;{FOR Index:=1 to 20} Close(SymbolConflictFile); END; {IF NOT DidCancel} END; {IF TypeConflict[1,1]<>''} END; {PROCEDURE GetInfo} {------------------------------------------------------------} BEGIN Message('Retrieving File'); GetFile(ImportFile); SetCursor(WatchC); Message('INITIALIZING ARRAYS'); IF NOT DidCancel THEN BEGIN FOR Index:=1 to 20 DO BEGIN TypeConflict[Index,1]:=''; TypeConflict[Index,2]:=''; TypeConflict[Index,3]:=''; END; TypeErrorCount:=0; Message('READING FILE'); GetInfo; DSelectAll; GetScreen(Scrx1, Scry1, Scrx2, Scry2); Rect(Scrx1, Scry1, Scrx2, Scry2); DeleteObjs; REDRAWALL; END; {IF NOT DidCancel} ClrMessage; SysBeep; SysBeep; SysBeep; SetCursor(ArrowC); END; {PROCEDURE ReadFile} Run(ReadFile); ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;A y,'`1@ _{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE SpaceSelectedInOpening; VAR ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; Space:REAL; RealX:REAL; RealY:Real; X1,Y1,X2,Y2:Real; Opening:Real; NumberOfLights:integer; Ok:boolean; PositionStr:string; PositionMatch:string; {---------------------------------------------------------} PROCEDURE FillArray; VAR index:integer; RealX,RealY:REAL; ok:boolean; messageNum:REAL; messageStr:string; BEGIN NumberOfLights:=0; LayerHandle:=FLayer; ObjHandle:=FSObject(LayerHandle); WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:=RealX; END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END; {PROCEDURE FillArray} {---------------------------------------------------------} PROCEDURE SortArray; VAR index1:integer; index2:integer; objectHolder:Handle; xHolder:REAL; yHolder:REAL; noChange:boolean; BEGIN noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO BEGIN IF XArray[index1]XArray[index2]} END; {FOR index2:=index1+1 to NumberOfLights} {FOR index1:=1 to NumberOfLights-1} END; {PROCEDURE SortArray} {---------------------------------------------------------} PROCEDURE MoveLights; VAR index:integer; deltaX:REAL; deltaY:REAL; destX:REAL; destY:REAL; objectX:REAL; objectY:REAL; aCode:integer; destStr:String; deltaStr:String; objectStr:String; BEGIN FOR index:=1 to NumberOfLights DO BEGIN destX:=RealX - ((index-1)*Space); GetSymLoc(HandleArray[index],objectX,objectY); deltaX:= destX - objectX; HMove(HandleArray[index],deltaX,0); END; {FOR index:=1 to NumberOfLights} END; {PROCEDURE MoveLights} {---------------------------------------------------------} BEGIN { SpaceSelectedInOpening} Message('Draw a line the width of the opening; double click to cancel'); GetLine(x1, y1, x2, y2); SetCursor(WatchC); Opening:=ABS(X2-X1); IF Opening > 12 THEN BEGIN Message('FINDING LIGHTS'); FillArray; Message('SORTING LIGHTS'); SortArray; IF NumberOfLights>0 THEN BEGIN Space:=Opening/NumberOfLights; Space:=ABS(Space); IF X1>X2 THEN RealX:=X1 ELSE RealX:=X2; RealX:=RealX-(Space/2); Message('MOVING LIGHTS'); MoveLights; END;{IF NumberOfLights>0} Redraw; END; {IF Space <> 0} ClrMessage; SysBeep; SetCursor(ArrowC); END; {PROCEDURE SpaceSelectedInOpening} RUN(SpaceSelectedInOpening); ny,;Any,;Any,;Any,;An;A y,'`1@ {Developed by Joshua Benghiat} { Copyright February 1998} PROCEDURE BeamSpread; LABEL 9; CONST kBeamAng = 3; kFieldAng = 2; kHight = 4; kFacePlane = 5; kFocusLocus = 6; kWSDist = 7; kValueCol = 2; kDrawFieldCone = 8; kFixtureSpacing = 9; VAR S:INTEGER; H:REAL; X,Y,Ix,Iy,D,D1,D2,R,D3,P,X1,Y1,X2,Y2,S2,RotAng:REAL; DlgAngle, DlgHeight:REAL; LayerHandle,ObjHandle,RecHandle,Ovhan:HANDLE; WSHan:HANDLE; Vect:VECTOR; AbortFlag:Boolean; {---------------------------------------------------------} BEGIN {BeamSpread} ANGLEVAR; ClrMessage; WSHan := GetObject('AutoPlot Preferences'); IF WSHan = NIL THEN BEGIN AlrtDialog('No AutoPlot Preferences worksheet found. MACRO ABORTED. Run Make Prefs macro'); GOTO 9; END; SelectSS(WSHan); IF (CellHasNum(WSHan,kFieldAng,2)) THEN DlgAngle := GetCellNUM(WSHan,kFieldAng,2); IF (CellHasNum(WSHan,kHight,2)) THEN DlgHeight := GetCellNUM(WSHan,kHight,2); S := .5 * IntDialog('Fixture Degree Spread (Field Angle) in degrees', Num2Str(0,DlgAngle)); IF (NOT DidCancel) THEN BEGIN NOANGLEVAR; LoadCell(DlgAngle,2,Num2Str(1,(2*S))); H := 12*RealDialog('Fixture Height in feet', Num2Str(0,DlgHeight)); IF (NOT DidCancel) THEN BEGIN LoadCell(kHight,2,Num2Str(1,(DlgHeight/12))); SetCursor(WatchC); LayerHandle := ActLayer; ObjHandle := FSObject(LayerHandle); LoadCell(kFieldAng,2,Num2Str(1,2*S)); LoadCell(kHight,2,Num2Str(1,H/12)); CloseSS(WSHan); IF GetType(ObjHandle)=15 THEN BEGIN RecHandle := GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN Message('Click on Focus Point'); Redraw; GetSymLoc(ObjHandle,IX,IY); GetPt(X,Y); D := Distance(IX,IY,X,Y); S2 := Deg2Rad(S); D2 := H * tan(ArcTan(D/H) + S2); D1 := H * tan(ArcTan(D/H) - S2); D3 := .5 * (D2 - D1); P := Sqrt((H * H) + (D3 * D3)); R := P * tan(S2); X1 := Ix - R; X2 := Ix + R; Y1 := Iy + D2; Y2 := Iy + D1; Oval(X1,Y1,X2,Y2); DSelectAll; Ovhan := LNewObj; Vect[1] := X - Ix; Vect[2] := Y - Iy; Vect[3] := 0; RotAng := Vec2Ang(Vect) - 90; SetSelect(Ovhan); RotatePoint(Ix,Iy,RotAng); SetFPat(Ovhan,0); Locus(X,Y); Group; DSelectAll; SetSelect(ObjHandle); END; {IF (RecHandle<>NIL)} END; {IF GetType(ObjHandle)=15} END; {IF (NOT DidCancel)} END; {IF (NOT DidCancel)} 9: ClrMessage; SetCursor(ArrowC); Redraw; END; {Procedure BeamSpread} RUN(BeamSpread); ny,;Any,;Any,;Any,;Any,;An;Ahy,'`,1@B{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE DimensionFromCtr; VAR ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; NumberOfLights:integer; UnitNumber:integer; Ok:boolean; PositionStr:string; PositionMatch:string; X1,Y1,X2,Y2:REAL; {---------------------------------------------------------} PROCEDURE GetObjectPosition(var theObject:Handle); VAR positStr:string; object:Handle; BEGIN PositionStr:=EvalStr(theObject,('Lights'.'Position')); Ok:=YNDialog(Concat('Position is ',PositionStr)); IF (not ok) THEN theObject:=NIL; END; {PROCEDURE GetObjectPosition} {---------------------------------------------------------} PROCEDURE FillArray(positionOk:boolean); VAR index:integer; RealX,RealY:REAL; ok:boolean; messageNum:REAL; messageStr:string; BEGIN NumberOfLights:=0; ObjHandle:=FSActLayer; WHILE ((GetType(ObjHandle)<>15) AND (ObjHandle<>NIL) AND (GetRecord(ObjHandle,1)=NIL)) DO ObjHandle:=NextSObj(ObjHandle); GetObjectPosition(ObjHandle); IF ObjHandle<>NIL THEN BEGIN positionOk:=True; LayerHandle:=FLayer; ObjHandle:=FSObject(LayerHandle); WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch:=EvalStr(ObjHandle,('Lights'.'Position')); IF PositionMatch=PositionStr THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); IF (ABS(RealX)>1) THEN BEGIN NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:=RealX; END; {IF RealX<>0} END; {IF PositionMatch='True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END {IF ObjHandle<>NIL} ELSE positionOk:=False; END; {PROCEDURE FillArray} {---------------------------------------------------------} PROCEDURE Switch(index1,index2:integer;noChange:boolean); VAR objectHolder:Handle; xHolder:REAL; BEGIN objectHolder:=HandleArray[index2]; xHolder:=XArray[index2]; HandleArray[index2]:=HandleArray[index1]; XArray[index2]:=XArray[index1]; HandleArray[index1]:=objectHolder; XArray[index1]:=xHolder; NoChange:=False; Message('SWITCH'); END; { PROCEDURE Switch} {---------------------------------------------------------} PROCEDURE SortArray; var index1:integer; index2:integer; objectHolder:Handle; xHolder:REAL; noChange:boolean; theKey:integer; BEGIN REPEAT noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO BEGIN IF XArray[index1] < 0 THEN BEGIN IF XArray[index2] < 0 THEN IF (XArray[index1] > XArray[index2]) THEN Switch(index1,index2,noChange); END {IF XArray[index1] < 0} ELSE IF ((XArray[index1] < XArray[index2]) AND (XArray[index2] > 0)) THEN Switch(index1,index2,noChange); END; {FOR index2:=index1+1 to NumberOfLights} {FOR index1:=1 to NumberOfLights-1} UNTIL (noChange); END; {PROCEDURE SortArray} {---------------------------------------------------------} PROCEDURE PlaceDimensions; VAR index:integer; unitNum:REAL; unitStr:string; doIt:boolean; BEGIN FOR index:=1 to NumberOfLights DO BEGIN unitStr := EvalStr(HandleArray[index], ('Lights'.'Unit #')); unitNum := Str2Num(unitStr); IF ((unitNum - TRUNC(unitNum) = 0) OR ((unitNum - TRUNC(unitNum) > 0.15) AND (unitNum - TRUNC(unitNum) < 0.25))) THEN doIt := TRUE ELSE doIt := FALSE; IF doIt THEN BEGIN GetSymLoc(HandleArray[index], X2,Y2); IF (ABS(X2)>1) THEN LinearDim(0,Y2,X2,Y2,(Y1-Y2),0,770,514,1); END; END; {FOR index:=1 to NumberOfLights} DoMenuText('SEND to Front'); END; {PROCEDURE AssignPositionValues} {---------------------------------------------------------} BEGIN { DimensionFromCtr } Message('Click on vertical dimension text location'); GetPt(X1,Y1); Message('FINDING LIGHTS'); SetCursor(WatchC); FillArray(Ok); IF Ok THEN BEGIN Message('SORTING LIGHTS'); SortArray; Message('PLACING DIMENSIONS'); PlaceDimensions; END; ClrMessage; Redraw; SysBeep; SetCursor(ArrowC); END; {PROCEDURE DimensionFromCtr} Run(DimensionFromCtr); n;Ay,'`(1@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE DimensionSequentially; VAR KeyCode:integer; ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; NumberOfLights:integer; UnitNumber:integer; Ok:boolean; PositionStr:string; PositionMatch:string; X,Y,X1,Y1,X2,Y2,X3,Y3:REAL; {---------------------------------------------------------} PROCEDURE GetObjectPosition(VAR theObject:Handle); VAR positStr:string; object:Handle; BEGIN PositionStr:=EvalStr(theObject,('Lights'.'Position')); Ok:=YNDialog(Concat('Position is ',PositionStr)); IF (not ok) THEN theObject:=NIL; END; {PROCEDURE GetObjectPosition} {---------------------------------------------------------} PROCEDURE FillArray(positionOk:boolean); VAR index:integer; RealX,RealY:REAL; ok:boolean; messageNum:REAL; messageStr:string; BEGIN NumberOfLights:=0; ObjHandle:=FSActLayer; WHILE ((GetType(ObjHandle)<>15) AND (ObjHandle<>NIL) AND (GetRecord(ObjHandle,1)=NIL)) DO ObjHandle:=NextSObj(ObjHandle); GetObjectPosition(ObjHandle); IF ObjHandle<>NIL THEN BEGIN positionOk:=True; LayerHandle:=FLayer; ObjHandle:=FSObject(LayerHandle); WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch:=EvalStr(ObjHandle,('Lights'.'Position')); IF PositionMatch=PositionStr THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:=RealX; END; {IF PositionMatch='True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END {IF ObjHandle<>NIL} ELSE positionOk:=False; END; {PROCEDURE FillArray} {---------------------------------------------------------} PROCEDURE Switch(index1,index2:integer;noChange:boolean); VAR objectHolder:Handle; xHolder:REAL; BEGIN objectHolder:=HandleArray[index2]; xHolder:=XArray[index2]; HandleArray[index2]:=HandleArray[index1]; XArray[index2]:=XArray[index1]; HandleArray[index1]:=objectHolder; XArray[index1]:=xHolder; NoChange:=False; Message('SWITCH'); END; { PROCEDURE Switch} {---------------------------------------------------------} PROCEDURE SortArray; VAR index1:integer; index2:integer; objectHolder:Handle; xHolder:REAL; noChange:boolean; theKey:integer; BEGIN REPEAT noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO BEGIN IF (XArray[index1] > XArray[index2]) THEN Switch(index1,index2,noChange); END; {FOR index2:=index1+1 to NumberOfLights} {FOR index1:=1 to NumberOfLights-1} UNTIL (noChange); END; {PROCEDURE SortArray} {---------------------------------------------------------} PROCEDURE PlaceDimensions; VAR index:integer; realIndex:REAL; stringHolder:string; handleHolder:Handle; unitNum:real; unitStr:string; doIt:boolean; BEGIN GetSymLoc(HandleArray[1], X1,Y1); FOR index:=2 to NumberOfLights DO BEGIN unitStr := EvalStr(HandleArray[index], ('Lights'.'Unit #')); unitNum := Str2Num(unitStr); IF ((unitNum - TRUNC(unitNum) = 0) OR ((unitNum - TRUNC(unitNum) > 0.15) AND (unitNum - TRUNC(unitNum) < 0.25))) THEN doIt := TRUE ELSE doIt := FALSE; IF doIt THEN BEGIN GetSymLoc(HandleArray[index], X2,Y2); LinearDim(X1,Y1,X2,Y2,(Y-Y1),0,770,1,0); X1 := X2; Y2 := Y2; END; END; {FOR index:=2 to NumberOfLights} DoMenuText('SEND to Front'); END; {PROCEDURE PlaceDimensions} {---------------------------------------------------------} BEGIN { DimensionSequentially } Message('Click on vertical dimension text location'); GetPt(X,Y); SetCursor(WatchC); Message('FINDING LIGHTS'); FillArray(Ok); IF Ok THEN BEGIN Message('SORTING LIGHTS'); SortArray; Message('PLACING DIMENSIONS'); PlaceDimensions; END; ClrMessage; Redraw; SysBeep; SetCursor(ArrowC); END; {PROCEDURE DimensionSequentially} Run( DimensionSequentially); ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;Ay,'`T1@{{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This Procedure draws the two sides of a beam's spread centered on a line that you have already drawn and selected} PROCEDURE BeamSection; VAR ObjHandle:Handle; Edge1,Edge2:Handle; AngleOfThrow:REAL; LightX,LightY:REAL; FootX,FootY:REAL; DupX,DupY:REAL; DiffX,DiffY:REAL; AngleOfSpread:REAL; BEGIN PushAttrs; ObjHandle:=FSActLayer; IF ((ObjHandle <> NIL) AND (GetType(ObjHandle)=2)) THEN BEGIN AngleOfSpread:=AngDialog('Beam Spread', '36'); AngleOfSpread:=AngleOfSpread/2; GetSegPt1(ObjHandle,LightX,LightY); GetSegPt2(ObjHandle,FootX,FootY); SetDSelect(ObjHandle); ArrowHead(2); MoveTo(LightX,LightY); LineTo(FootX,FootY); Edge1:=FSActLayer; SetDSelect(Edge1); ArrowHead(2); MoveTo(LightX,LightY); LineTo(FootX,FootY); Edge2:=FSActLayer; SetDSelect(Edge2); SetSelect(Edge1); GetSegPt1(Edge1,DupX,DupY); ANGLEVAR; Rotate(#AngleOfSpread); NOANGLEVAR; GetSegPt1(Edge1,DupX,DupY); DiffX:=LightX-DupX; DiffY:=LightY-DupY; MoveObjs(DiffX, DiffY, FALSE, FALSE); SetDSelect(Edge1); SetSelect(Edge2); ANGLEVAR; AngleOfSpread:=AngleOfSpread*(-1); Rotate(#AngleOfSpread); NOANGLEVAR; GetSegPt1(Edge2,DupX,DupY); DiffX:=LightX-DupX; DiffY:=LightY-DupY; MoveObjs(DiffX, DiffY, FALSE, FALSE); SetSelect(Edge1); SetSelect(Edge2); PopAttrs; SetTool(2); Redraw; END {IF ObjHandle <> NIL} ELSE AlrtDialog('You must draw & select a line from the source to the destination first, then activate Beam Section'); END; {PROCEDURE BeamSection} RUN(BeamSection); ny,;Any,;Any,;Any,;Any,;An;A y,'`t1@ {Developed by Joshua Benghiat} { Copyright February 1998} PROCEDURE BeamSpread; LABEL 9; CONST kBeamAng = 3; kFieldAng = 2; kHight = 4; kFacePlane = 5; kFocusLocus = 6; kWSDist = 7; kValueCol = 2; kDrawFieldCone = 8; kFixtureSpacing = 9; VAR S:INTEGER; H:REAL; X,Y,Ix,Iy,D,D1,D2,R,D3,P,X1,Y1,X2,Y2,S2,RotAng:REAL; DlgAngle, DlgHeight:REAL; LayerHandle,ObjHandle,RecHandle,Ovhan:HANDLE; WSHan:HANDLE; Vect:VECTOR; AbortFlag:Boolean; {---------------------------------------------------------} BEGIN {BeamSpread} ANGLEVAR; ClrMessage; WSHan := GetObject('AutoPlot Preferences'); IF WSHan = NIL THEN BEGIN AlrtDialog('No AutoPlot Preferences worksheet found. MACRO ABORTED. Run Make Prefs macro'); GOTO 9; END; SelectSS(WSHan); IF (CellHasNum(WSHan,kFieldAng,2)) THEN DlgAngle := GetCellNUM(WSHan,kFieldAng,2); IF (CellHasNum(WSHan,kHight,2)) THEN DlgHeight := GetCellNUM(WSHan,kHight,2); S := .5 * IntDialog('Fixture Degree Spread (Field Angle) in degrees', Num2Str(0,DlgAngle)); IF (NOT DidCancel) THEN BEGIN NOANGLEVAR; LoadCell(DlgAngle,2,Num2Str(1,(2*S))); H := RealDialog('Fixture Height in Drawing Units', Num2Str(0,DlgHeight)); IF (NOT DidCancel) THEN BEGIN SetCursor(WatchC); LayerHandle := ActLayer; ObjHandle := FSObject(LayerHandle); LoadCell(kFieldAng,2,Num2Str(1,2*S)); LoadCell(kHight,2,Num2Str(1,H)); IF GetType(ObjHandle)=15 THEN BEGIN RecHandle := GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN Message('Click on Focus Point'); Redraw; GetSymLoc(ObjHandle,IX,IY); GetPt(X,Y); D := Distance(IX,IY,X,Y); S2 := Deg2Rad(S); D2 := H * tan(ArcTan(D/H) + S2); D1 := H * tan(ArcTan(D/H) - S2); D3 := .5 * (D2 - D1); P := Sqrt((H * H) + (D3 * D3)); R := P * tan(S2); X1 := Ix - R; X2 := Ix + R; Y1 := Iy + D2; Y2 := Iy + D1; Oval(X1,Y1,X2,Y2); DSelectAll; Ovhan := LNewObj; Vect[1] := X - Ix; Vect[2] := Y - Iy; Vect[3] := 0; RotAng := Vec2Ang(Vect) - 90; SetSelect(Ovhan); RotatePoint(Ix,Iy,RotAng); SetFPat(Ovhan,0); Locus(X,Y); Group; DSelectAll; SetSelect(ObjHandle); END; {IF (RecHandle<>NIL)} END; {IF GetType(ObjHandle)=15} END; {IF (NOT DidCancel)} END; {IF (NOT DidCancel)} 9: ClrMessage; SetCursor(ArrowC); Redraw; END; {Procedure BeamSpread} RUN(BeamSpread); n;A,y,'`|1@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This macro is different from entering data in the Data Window, because it} {will query each light individually for each selected light. BE CAREFULL.} {The macro does not use postion number order. It uses the order in the data} {base (usually creation order).} PROCEDURE EnterDataForSelectedSRtoSL; var ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; NumberOfLights:integer; RealHolder, RealX, RealY:REAL; StringHolder:string; Ok:boolean; PositionStr:string; PositionMatch:string; item:integer; {===================================================} PROCEDURE FillArray; var count:integer; BEGIN NumberOfLights:=0; ObjHandle:=FSActLayer; IF ObjHandle<>NIL THEN BEGIN LayerHandle:=FLayer; WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN NumberOfLights:=NumberOfLights+1; GetSymLoc(ObjHandle,RealX,RealY); XArray[NumberOfLights]:=RealX; HandleArray[NumberOfLights]:=ObjHandle; END; {IF (RecHandle<>NIL)} END; {IF GetType(ObjHandle)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END; {IF ObjHandle<>NIL} END; {PROCEDURE FillArray} {===================================================} PROCEDURE SortArray; var index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; noChange:boolean; cirString:string; realHolder:REAL; BEGIN noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO BEGIN IF XArray[index1]>XArray[index2] THEN BEGIN objectHolder:=HandleArray[index2]; xHolder:=XArray[index2]; HandleArray[index2]:=HandleArray[index1]; XArray[index2]:=XArray[index1]; HandleArray[index1]:=objectHolder; XArray[index1]:=xHolder; NoChange:=False; END; {IF XArray[index1]>XArray[index2]} END; {FOR index2:=index1+1 to NumberOfLights} {FOR index1:=1 to NumberOfLights-1} END; {PROCEDURE SortArray} {===================================================} PROCEDURE MakDlog; var item:integer; BEGIN item:=1; BEGINDialog(1,1,22,30,317,365); AddButton('Enter',1,1,188,309,246,329); AddButton('Finished',2,1,34,309,92,329); AddField('Unit#:',3,1,14,6,89,22); AddField('Position:',4,1,14,29,89,45); AddField('Channel:',5,1,14,52,89,68); AddField('Short Purp:',6,1,14,75,89,91); AddField('Type:',7,1,14,98,89,114); AddField('Circuit:',8,1,14,122,89,137); AddField('Color:',9,1,14,145,89,160); AddField('Dimmer:',10,1,14,168,89,183); AddField('Purpose:',11,1,14,191,89,206); AddField('Wattage:',12,1,14,214,89,229); AddField('Template:',13,1,14,237,89,252); AddField('Miscl#1:',14,1,14,260,89,275); AddField('Miscl#2:',15,1,14,283,89,298); AddField('#',16,2,94,6,283,22); AddField('Position',17,2,94,29,283,45); AddField('Cha',18,2,94,52,283,68); AddField('Short P',19,2,94,75,283,91); AddField('unittype',20,2,94,98,283,114); AddField('Cir',21,2,94,122,283,137); AddField('color',22,2,94,145,283,160); AddField('dim',23,2,94,168,283,183); AddField('purp',24,2,94,191,283,206); AddField('watt',25,2,94,214,283,229); AddField('temp',26,2,94,237,283,252); AddField('Misc1',27,2,94,260,283,275); AddField('Misc2',28,2,94,283,283,298); ENDDialog; END; {PROCEDURE MakDlog} {===================================================} PROCEDURE QueryValues; const unitfld=16; posfld=17; chanfld=18; shortfld=19; typefld=20; cirfld=21; colorfld=22; dimfld=23; purpfld=24; wattfld=25; tempfld=26; misc1fld=27; misc2fld=28; Var index:integer; item:integer; realIndex:REAL; stringHolder:string; pos,unit,cir,chan,color,dim,purp,short, temp,misc1,misc2,unittype,watt:string; handleHolder:Handle; BEGIN MakDlog; GetDialog(1); FOR index:=1 to NumberOfLights DO BEGIN realIndex:=index; unit:=EvalStr(HandleArray[index],('Lights'.'Unit #')); SetField(unitfld,unit); pos:=EvalStr(HandleArray[index],('Lights'.'Position')); SetField(posfld,pos); cir:=EvalStr(HandleArray[index],('Lights'.'Circuit')); SetField(cirfld,cir); chan:=EvalStr(HandleArray[index],('Lights'.'Channel')); SetField(chanfld,chan); short:=EvalStr(HandleArray[index],('Lights'.'Short Purp')); SetField(shortfld,short); color:=EvalStr(HandleArray[index],('Lights'.'Color')); SetField(colorfld,color); dim:=EvalStr(HandleArray[index],('Lights'.'Dimmer')); SetField(dimfld,dim); purp:=EvalStr(HandleArray[index],('Lights'.'Purpose')); SetField(purpfld,purp); temp:=EvalStr(HandleArray[index],('Lights'.'Template')); SetField(tempfld,temp); misc1:=EvalStr(HandleArray[index],('Lights'.'Miscl#1')); SetField(misc1fld,misc1); misc2:=EvalStr(HandleArray[index],('Lights'.'Miscl#2')); SetField(misc2fld,misc2); unittype:=EvalStr(HandleArray[index],('Lights'.'Type')); SetField(typefld,unittype); watt:=EvalStr(HandleArray[index],('Lights'.'Wattage')); SetField(wattfld,watt); SelField(unitfld); item:=0; REPEAT DialogEvent(item); UNTIL ((item=1) or (item=2)); unit:=GetField(unitfld); SetRField(HandleArray[index],'Lights', 'Unit #', unit); pos:=GetField(posfld); SetRField(HandleArray[index],'Lights', 'Position', pos); cir:=GetField(cirfld); SetRField(HandleArray[index],'Lights', 'Circuit', cir); chan:=GetField(chanfld); SetRField(HandleArray[index],'Lights', 'Channel', chan); short:=GetField(shortfld); SetRField(HandleArray[index],'Lights', 'Short Purp', short); color:=GetField(colorfld); SetRField(HandleArray[index],'Lights', 'Color', color); dim:=GetField(dimfld); SetRField(HandleArray[index],'Lights', 'Dimmer', dim); purp:=GetField(purpfld); SetRField(HandleArray[index],'Lights', 'Purpose', purp); temp:=GetField(tempfld); SetRField(HandleArray[index],'Lights', 'Template', temp); misc1:=GetField(misc1fld); SetRField(HandleArray[index],'Lights', 'Miscl#1', misc1); misc2:=GetField(misc2fld); SetRField(HandleArray[index],'Lights', 'Miscl#2', misc2); unittype:=GetField(typefld); SetRField(HandleArray[index],'Lights', 'Type', unittype); watt:=GetField(wattfld); SetRField(HandleArray[index],'Lights', 'Wattage', watt); IF item=2 THEN index:=NumberOfLights END; {FOR index:=1 to NumberOfLights} ClrDialog; END; {PROCEDURE QueryValues} {===================================================} BEGIN Message('Filling Array'); FillArray; Message('SortArray'); SortArray; Message('QueryValues'); QueryValues; MoveObjs(2,0,true,true); MoveObjs(-2,0,true,true); Redraw; ClrMessage; END; Run(EnterDataForSelectedSRtoSL); n;A y,1@ {Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE LegendMetric; VAR LayerHandle:Handle; ObjHandle:Handle; NumberOfLights:Integer; Index:Integer; Cnt:Integer; LegendX,LegendY:Real; CurrentName:string; RotationAng:Real; SymbolNameHolder:string; SymbolNames:array[1..25] of string; LegendNames:array[1..25] of string; AlreadyThere:boolean; DoIt:boolean; Units:Real; Frac,DispAcc:longint; Format:integer; Upi:real; UnitMk,SqrUnitMk:string; BEGIN GetUnits( Frac,DispAcc,Format,Upi,UnitMk,SqrUnitMk); DoIt:=YNDialog('Will delete all text attached to a class that is not in a symbol. OK ?'); IF DoIt THEN BEGIN MESSAGE('Select Upper Left Corner of Legend'); GetPt(LegendX,LegendY); SetCursor(WatchC); SelectObj((T=Symbol)); NumberOfLights:=0; Cnt:=0; LayerHandle:=FLayer; WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN Cnt:=Cnt+1; Message(concat('Fixture #',Num2Str(0,Cnt))); SymbolNameHolder:=GetSymName(ObjHandle); IF Pos('FRES',SymbolNameHolder)>0 THEN CurrentName:=Copy(SymbolNameHolder, 1, Pos('FRES',SymbolNameHolder) + 3) ELSE IF Pos('X',SymbolNameHolder)>0 THEN BEGIN If Pos(' ',SymbolNameHolder)>0 THEN CurrentName:=Copy(SymbolNameHolder,1,Pos(' ',SymbolNameHolder)-1) ELSE CurrentName:=Copy(SymbolNameHolder,1,4); END ELSE IF Pos('SOURCE',SymbolNameHolder)>0 THEN CurrentName:=Copy(SymbolNameHolder,1,10) ELSE CurrentName:=SymbolNameHolder; AlreadyThere:=FALSE; FOR Index:=1 to NumberOfLights DO BEGIN IF Pos(CurrentName, LegendNames[Index])>0 THEN AlreadyThere:=TRUE; END;{FOR Index:=1 to NumberOfLights} IF NOT AlreadyThere THEN BEGIN NumberOfLights:=NumberOfLights+1; LegendNames[NumberOfLights]:=CurrentName; {AlrtDialog(Concat('SymbolNameHolder = ',SymbolNameHolder));} SymbolNames[NumberOfLights]:=SymbolNameHolder; END;{IF NOT AlreadyThere} ObjHandle:=NextSObj(ObjHandle); END;{WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END;{WHILE LayerHandle<>NIL} DselectAll Message('past collection routine'); TextSize(12); MoveTo(LegendX,LegendY); FOR Index:=1 to NumberOfLights DO BEGIN RotationAng:=270; IF Pos('>',SymbolNames[Index])>0 THEN RotationAng:=0; IF Pos('/',SymbolNames[Index])>0 THEN RotationAng:=315; IF Pos('bl',SymbolNames[Index])>0 THEN RotationAng:=90; IF Pos('DS',SymbolNames[Index])>0 THEN RotationAng:=90; IF Pos('boom',SymbolNames[Index])>0 THEN RotationAng:=180; Symbol(SymbolNames[Index], LegendX, LegendY-((18*Upi)*(Index-1)),RotationAng); DoMenuText('Symbol to Group'); Ungroup; END; DSelectAll; SelectObj((C<>'None') & (T=Text)); DeleteObjs; FOR Index:=1 to NumberOfLights DO BEGIN MoveTo(LegendX+(24*Upi),LegendY-((18*Upi)*(Index-1))+(2*Upi)); BeginText; LegendNames[Index] EndText; END; MoveObjs(10,0,FALSE,TRUE); MoveObjs(-10,0,FALSE,TRUE); REDRAW; SetCursor(ArrowC); ClrMessage; END; END;{PROCEDURE LegendMetric} RUN(LegendMetric); py,'`1@J{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {Added by MsM 5/27/98 will accept CYC, XRAY, FOOTLIGHT and STRIP} {in the Symbol Name} {This PROCEDURE will number the selected units from stage left in groups, i.e. 1, 2, 3.} {Striplight and Cyc units will be assumed to have 3 circuits each and wil be labeled A1, A2, A3, A4, B1, B2, etc.} PROCEDURE Number3CirStrips; VAR ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; NumberOfLights:integer; UnitNumber:integer; Ok:boolean; PositionStr:string; PositionMatch:string; X1,Y1,X2,Y2:REAL; {---------------------------------------------------------} PROCEDURE GetObjectPosition(VAR theObject:Handle); VAR positStr:string; object:Handle; BEGIN PositionStr:=EvalStr(theObject,('Lights'.'Position')); Ok:=YNDialog(Concat('Position is ',PositionStr)); IF (not ok) THEN theObject:=NIL ELSE UnitNumber:=IntDialog('Start at what number', '1'); END; {PROCEDURE GetObjectPosition} {---------------------------------------------------------} PROCEDURE FillArray(positionOk:boolean); VAR index:integer; RealX,RealY:REAL; ok:boolean; messageNum:REAL; messageStr:string; BEGIN NumberOfLights:=0; ObjHandle:=FSActLayer; WHILE ((GetType(ObjHandle)<>15) AND (ObjHandle<>NIL) AND (GetRecord(ObjHandle,1)=NIL)) DO ObjHandle:=NextSObj(ObjHandle); GetObjectPosition(ObjHandle); IF ObjHandle<>NIL THEN BEGIN SetCursor(WatchC); positionOk:=True; LayerHandle:=FLayer; ObjHandle:=FSObject(LayerHandle); WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch:=EvalStr(ObjHandle,('Lights'.'Position')); IF PositionMatch=PositionStr THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:=RealX; END; {IF PositionMatch='True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END {IF ObjHandle<>NIL} ELSE positionOk:=False; END; {PROCEDURE FillArray} {---------------------------------------------------------} PROCEDURE SortArray; VAR index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; noChange:boolean; BEGIN noChange:=True; FOR index1:=1 to NumberOfLights-1 DO BEGIN FOR index2:=index1+1 to NumberOfLights DO BEGIN IF XArray[index1]XArray[index2]} END; {FOR index2:=index1+1 to NumberOfLights} END; {FOR index1:=1 to NumberOfLights-1} END; {PROCEDURE SortArray} {---------------------------------------------------------} FUNCTION GetCycUnitNumber(theUnitNumber,theFraction:REAL) : STRING; VAR unitStr:String; unitFrac:String; fracHolder:REAL; BEGIN unitStr := CHR(theUnitNumber + 64); fracHolder := theFraction * 10; unitFrac := Num2Str(0,fracHolder); GetCycUnitNumber := concat(unitStr,unitFrac); END; {FUNCTION GetCycUnitNumber} {---------------------------------------------------------} PROCEDURE AssignPositionValues; VAR index:integer; isStrip:integer; realIndex:REAL; fraction:REAL; stringHolder:string; handleHolder:Handle; keyThing:integer; thing:boolean; stripNumber:REAL; BEGIN fraction:=0; stripNumber:=0; IF UnitNumber <> 0 THEN BEGIN UnitNumber:=UnitNumber-1; fraction:=0.34; FOR index:=1 to NumberOfLights DO BEGIN IF index=1 THEN HCenter(HandleArray[index], X1,Y1); IF index=NumberOfLights THEN HCenter(HandleArray[index], X2,Y2); ObjHandle:=HandleArray[index]; stringHolder:=GetSymName(ObjHandle); UprString(stringHolder); isStrip:=Pos('CYC', stringHolder); IF isStrip=0 THEN isStrip:=Pos('STRIP', stringHolder); IF isStrip=0 THEN {These two lines added 5/27/98 by MsM} isStrip:=Pos('XRAY', stringHolder); IF isStrip=0 THEN {These two lines added 5/27/98 by MsM} isStrip:=Pos('FOOTLIGHT', stringHolder); IF isStrip>0 THEN BEGIN fraction:=fraction+0.1; IF fraction>0.34 THEN BEGIN fraction:=0.1; stripNumber:=stripNumber + 1; END; stringHolder := GetCycUnitNumber(stripNumber,fraction); END {IF isStrip>0} ELSE BEGIN UnitNumber:=UnitNumber+1; stringHolder:=Num2Str(0,UnitNumber); END; SetRField(HandleArray[index],'Lights','Unit #',stringHolder); END; {FOR index:=1 to NumberOfLights} END; END; {PROCEDURE AssignPositionValues} {---------------------------------------------------------} BEGIN Message('FINDING LIGHTS'); Ungroup; FillArray(Ok); IF Ok THEN BEGIN Message('SORTING LIGHTS'); SortArray; Message('ASSIGNING NUMBERS'); AssignPositionValues; END; ClrMessage; {THE FOLLOWING IS USED TO GET MC TO REDRAW} {ONLY THE RENUMBERED ITEMS} MoveObjs(2,0,true,true); MoveObjs(-2,0,true,true); Redraw SetCursor(ArrowC); SysBeep; END; {PROCEDURE Number3CirStrips;} Run(Number3CirStrips); ny,;Any,;An;Asy,1@M{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {Added by MsM 5/27/98 will accept CYC, XRAY, FOOTLIGHT and STRIP} {in the Symbol Name} {This PROCEDURE will number the selected units from stage left in groups, i.e. 1, 2, 3.} {Striplight and Cyc units will be assumed to have 4 circuits each and wil be labeled A1, A2, A3, A4, B1, B2, etc.} PROCEDURE Number4CirStrips; VAR ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; NumberOfLights:integer; UnitNumber:integer; Ok:boolean; PositionStr:string; PositionMatch:string; X1,Y1,X2,Y2:REAL; {---------------------------------------------------------} PROCEDURE GetObjectPosition(VAR theObject:Handle); VAR positStr:string; object:Handle; BEGIN PositionStr:=EvalStr(theObject,('Lights'.'Position')); Ok:=YNDialog(Concat('Position is ',PositionStr)); IF (not ok) THEN theObject:=NIL ELSE UnitNumber:=IntDialog('Start at what number', '1'); END; {PROCEDURE GetObjectPosition} {---------------------------------------------------------} PROCEDURE FillArray(positionOk:boolean); VAR index:integer; RealX,RealY:REAL; ok:boolean; messageNum:REAL; messageStr:string; BEGIN NumberOfLights:=0; ObjHandle:=FSActLayer; WHILE ((GetType(ObjHandle)<>15) AND (ObjHandle<>NIL) AND (GetRecord(ObjHandle,1)=NIL)) DO ObjHandle:=NextSObj(ObjHandle); GetObjectPosition(ObjHandle); IF ObjHandle<>NIL THEN BEGIN SetCursor(WatchC); positionOk:=True; LayerHandle:=FLayer; ObjHandle:=FSObject(LayerHandle); WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN PositionMatch:=EvalStr(ObjHandle,('Lights'.'Position')); IF PositionMatch=PositionStr THEN BEGIN GetSymLoc(ObjHandle,RealX,RealY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:=RealX; END; {IF PositionMatch='True'} END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END {IF ObjHandle<>NIL} ELSE positionOk:=False; END; {PROCEDURE FillArray} {---------------------------------------------------------} PROCEDURE SortArray; VAR index1:integer; index2:integer; objectHolder:Handle; xHolder:LongInt; noChange:boolean; BEGIN noChange:=True; FOR index1:=1 to NumberOfLights-1 DO BEGIN FOR index2:=index1+1 to NumberOfLights DO BEGIN IF XArray[index1]XArray[index2]} END; {FOR index2:=index1+1 to NumberOfLights} END; {FOR index1:=1 to NumberOfLights-1} END; {PROCEDURE SortArray} {---------------------------------------------------------} FUNCTION GetCycUnitNumber(theUnitNumber,theFraction:REAL) : STRING; VAR unitStr:String; unitFrac:String; fracHolder:REAL; BEGIN unitStr := CHR(theUnitNumber + 64); fracHolder := theFraction * 10; unitFrac := Num2Str(0,fracHolder); GetCycUnitNumber := concat(unitStr,unitFrac); END; {FUNCTION GetCycUnitNumber} {---------------------------------------------------------} PROCEDURE AssignPositionValues; VAR index:integer; isStrip:integer; realIndex:REAL; fraction:REAL; stringHolder:string; handleHolder:Handle; keyThing:integer; thing:boolean; stripNumber:REAL; BEGIN fraction:=0; stripNumber:=0; IF UnitNumber <> 0 THEN BEGIN UnitNumber:=UnitNumber-1; fraction:=0.4; FOR index:=1 to NumberOfLights DO BEGIN IF index=1 THEN HCenter(HandleArray[index], X1,Y1); IF index=NumberOfLights THEN HCenter(HandleArray[index], X2,Y2); ObjHandle:=HandleArray[index]; stringHolder:=GetSymName(ObjHandle); UprString(stringHolder); isStrip:=Pos('CYC', stringHolder); IF isStrip=0 THEN isStrip:=Pos('STRIP', stringHolder); IF isStrip=0 THEN {These two lines added 5/27/98 by MsM} isStrip:=Pos('XRAY', stringHolder); IF isStrip=0 THEN {These two lines added 5/27/98 by MsM} isStrip:=Pos('FOOTLIGHT', stringHolder); IF isStrip>0 THEN BEGIN fraction:=fraction+0.1; IF fraction>0.4 THEN BEGIN fraction:=0.1; stripNumber:=stripNumber + 1; END; stringHolder := GetCycUnitNumber(stripNumber,fraction); END {IF isStrip>0} ELSE BEGIN UnitNumber:=UnitNumber+1; stringHolder:=Num2Str(0,UnitNumber); END; SetRField(HandleArray[index],'Lights','Unit #',stringHolder); END; {FOR index:=1 to NumberOfLights} END; END; {PROCEDURE AssignPositionValues} {---------------------------------------------------------} BEGIN Message('FINDING LIGHTS'); Ungroup; FillArray(Ok); IF Ok THEN BEGIN Message('SORTING LIGHTS'); SortArray; Message('ASSIGNING NUMBERS'); AssignPositionValues; END; ClrMessage; {THE FOLLOWING IS USED TO GET MC TO REDRAW} {ONLY THE RENUMBERED ITEMS} MoveObjs(2,0,true,true); MoveObjs(-2,0,true,true); Redraw; SetCursor(ArrowC); SysBeep; END; {PROCEDURE Number3CirStrips;} Run(Number4CirStrips); y,'`1@ {Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This Macro replaces selected lights with the currently selected} {symbol, retaining the original database info} PROCEDURE ReplaceGroup; var SymbolObjects:Array[1..50] of Handle; ObjHandle: Handle; LayerHandle:Handle; Ok:boolean; SymbolName:string; SymRot:Real; X,Y:Real; Index:integer; Unit,Pos,Cir,Chan,Color,Dim,Watt,Type,Temp:string; Purp,ShortPurp,Misc1,Misc2,SymName:string; StringNumber:string; {--------------------------------------------------------------} PROCEDURE FillSymbolArray; VAR objectHandle:Handle; stringNumber:string; BEGIN FOR Index:=1 to 25 DO SymbolObjects[Index]:=NIL; Index:=0; LayerHandle:=ActLayer; objectHandle:=FSObject(LayerHandle); WHILE objectHandle<>NIL DO BEGIN IF (GetType(objectHandle)=11)THEN BEGIN Index:=Index+1; SymbolObjects[Index]:=objectHandle; END; {IF ((GetType(ObjHandle)=15)} objectHandle:=NextSObj(objectHandle); END; {WHILE objectHandle<>NIL} DSelectAll; Message('Leaving FillSymbolArray'); END; {PROCEDURE FillSymbolArray} {--------------------------------------------------------------} PROCEDURE PickUpDataStrings(objectHandle:Handle); BEGIN Unit:=EvalStr(objectHandle,('Lights'.'Unit #')); Pos:=EvalStr(objectHandle,('Lights'.'Position')); Chan:=EvalStr(objectHandle,('Lights'.'Channel')); Purp:=EvalStr(objectHandle,('Lights'.'Purpose')); Color:=EvalStr(objectHandle,('Lights'.'Color')); Cir:=EvalStr(objectHandle,('Lights'.'Circuit')); Dim:=EvalStr(objectHandle,('Lights'.'Dimmer')); { Watt:=EvalStr(objectHandle,('Lights'.'Wattage')); use new symbol data } { Type:=EvalStr(objectHandle,('Lights'.'Type')); use new symbol data } Temp:=EvalStr(objectHandle,('Lights'.'Template')); ShortPurp:=EvalStr(objectHandle,('Lights'.'Short Purp')); Misc1:=EvalStr(objectHandle,('Lights'.'Miscl#1')); Misc2:=EvalStr(objectHandle,('Lights'.'Miscl#2')); SymName:=GetName(objectHandle); END; {Procedure PickUpDataStrings} {--------------------------------------------------------------} PROCEDURE PutDownDataStrings(objectHandle:Handle); BEGIN SetRField(objectHandle,'Lights', 'Unit #', Unit); SetRField(objectHandle,'Lights', 'Position', Pos); SetRField(objectHandle,'Lights', 'Channel', Chan); SetRField(objectHandle,'Lights', 'Purpose', Purp); SetRField(objectHandle,'Lights', 'Color', Color); SetRField(objectHandle,'Lights', 'Circuit', Cir); SetRField(objectHandle,'Lights', 'Dimmer', Dim); { SetRField(objectHandle,'Lights', 'Wattage', Watt); use new symbol data } { SetRField(objectHandle,'Lights', 'Type', Type); use new symbol data } SetRField(objectHandle,'Lights', 'Template', Temp); SetRField(objectHandle,'Lights', 'Short Purp', ShortPurp); SetRField(objectHandle,'Lights', 'Miscl#1', Misc1); SetRField(objectHandle,'Lights', 'Miscl#2', Misc2); IF SymName<>'none' THEN SetName(ObjHandle,SymName); END; {PROCEDURE PutDownDataStrings} {--------------------------------------------------------------} BEGIN {* DoMenu(1387, NoKey); *} SetCursor(WatchC); ObjHandle:=ActSymDef; SymbolName:=GetSDName(ObjHandle); IF SymbolName<>'' THEN BEGIN FillSymbolArray; Index:=1; WHILE ((SymbolObjects[Index]<>NIL) AND (Index<26)) DO BEGIN ObjHandle:=SymbolObjects[Index]; PickUpDataStrings(ObjHandle); HCenter(ObjHandle,X,Y); SymRot:= 0; DelObject(ObjHandle); Symbol(SymbolName, X, Y, SymRot); ObjHandle:= LNewObj; PutDownDataStrings(ObjHandle); Index:=Index+1; END; {WHILE ((SymbolObjects[Index]<>NIL)} END {IF SymbolName<>''} ELSE AlrtDialog('No New Symbol is active'); ClrMessage; SetCursor(ArrowC); END; {PROCEDURE ReplaceGroup} Run(ReplaceGroup); n;Ay,'`1@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE WriteData; VAR ExportFile:Text; FileName:STRING; ObjHandle:Handle; LayerHandle:Handle; NumberOfLights:integer; RealNumber:Real; Index:integer; UnNamedSymbols:integer; Counter:integer; CounterHolder:REAL; CounterStr:String; X,Y:real; XStr,YStr:String; UnitStr,PosStr,TypeStr,WattStr,CirStr,ChanStr,TempStr:STRING; ColorStr,FunStr,DimStr,ShortStr,Miscl1Str,Miscl2Str:STRING; OutputStr:STRING; theNameStr:STRING; AlrtStr1,AlrtStr2,AlrtStr3:string; AlrtNum1,AlrtNum2,AlrtNum3:real; Procedure FillStrings; BEGIN UnitStr:=EvalStr(ObjHandle, ('Lights'.'Unit #')); PosStr:=EvalStr(ObjHandle, ('Lights'.'Position')); IF len(PosStr)<2 THEN PosStr:=concat('(x=',XStr,') (y=',YStr,')'); TypeStr:=EvalStr(ObjHandle, ('Lights'.'Type')); WattStr:=EvalStr(ObjHandle, ('Lights'.'Wattage')); CirStr:=EvalStr(ObjHandle, ('Lights'.'Circuit')); ChanStr:=EvalStr(ObjHandle, ('Lights'.'Channel')); ColorStr:=EvalStr(ObjHandle, ('Lights'.'Color')); FunStr:=EvalStr(ObjHandle, ('Lights'.'Purpose')); TempStr:=EvalStr(ObjHandle, ('Lights'.'Template')); DimStr:=EvalStr(ObjHandle, ('Lights'.'Dimmer')); ShortStr:=EvalStr(ObjHandle, ('Lights'.'Short Purp')); Miscl1Str:=EvalStr(ObjHandle, ('Lights'.'Miscl#1')); Miscl2Str:=EvalStr(ObjHandle, ('Lights'.'Miscl#2')); Index:=Index+1; theNameStr := GetName(ObjHandle); IF ValidNumStr(theNameStr,CounterHolder) THEN BEGIN IF (CounterHolder <= 0) THEN BEGIN CounterStr:=Num2Str(0,Counter); SetName(ObjHandle,CounterStr); OutputStr:=concat('#',UnitStr,' ',PosStr,' (new - ',Num2Str(0,Index),' name(',CounterStr, ')'); Counter:=Counter-1; END {IF (CounterStr < 0)} ELSE BEGIN {CounterHolder > 0} CounterStr:=theNameStr; OutputStr:=concat('#',UnitStr,' ',PosStr,' (old - ',Num2Str(0,Index),' name(',CounterStr, ')'); END; {Else CounterStr>0} END {IF ValidNumStr(theNameStr,CounterHolder)} ELSE IF (theNameStr = 'none') THEN BEGIN CounterStr:=Num2Str(0,Counter); SetName(ObjHandle,CounterStr); OutputStr:=concat('#',UnitStr,' ',PosStr,' (new - ',Num2Str(0,Index),' name(',CounterStr, ')'); Counter:=Counter-1; END {ELSE IF (theNameStr = 'none')} ELSE BEGIN {theNameStr 'none'} CounterStr:=theNameStr; OutputStr:=concat('#',UnitStr,' ',PosStr,' (old - ',Num2Str(0,Index),' name(',CounterStr, ')'); END; {Else theNameStr 'none'} End; {Procedure FillStrings} {-------------------------------------------------------------} PROCEDURE SetLabels; BEGIN UnitStr := 'Unit#'; PosStr := 'Position'; TypeStr := 'Type'; WattStr := 'Wattage'; CirStr := 'Circuit'; ChanStr := 'Channel'; ColorStr := 'Color'; FunStr := 'Purpose'; TempStr := 'Template'; DimStr := 'Dimmer'; ShortStr := 'Short Purp'; Miscl1Str := 'Miscl#1'; Miscl2Str := 'Miscl#2'; CounterStr := 'PlotLink' END; {PROCEDURE SetLabels} {-------------------------------------------------------------} Procedure WriteOutput; Begin Write(UnitStr);{0} Tab(1); Write(PosStr); {1} Tab(1); Write(ChanStr); {2} Tab(1); Write(ShortStr); {3} Tab(1); Write(TypeStr); {4} Tab(1); Write(CirStr); {5} Tab(1); Write(ColorStr); {6} Tab(1); Write(DimStr); {7} Tab(1); Write(FunStr); {8} Tab(1); Write(WattStr); {9} Tab(1); Write(TempStr); {10} Tab(1); Write(Miscl1Str); {11} Tab(1); Write(Miscl2Str); {12} Tab(1); Writeln(CounterStr); {13} End; {Procedure WriteOutput} {-------------------------------------------------------------} BEGIN ExportFile:='Lights.export'; PutFile('Name file - Lights.export', 'Lights.export',ExportFile); IF NOT DidCancel THEN BEGIN SetCursor(WatchC); IF GetObject('NameCounter') = NIL THEN BEGIN TextSize(3); NameObject('NameCounter'); TextOrigin(0,0); BeginText; '32000' EndText; ObjHandle:=GetObject('NameCounter'); SetClass(ObjHandle,'CounterClass'); HideClass('CounterClass'); Counter:=32000; END ELSE BEGIN ObjHandle:=GetObject('NameCounter'); CounterStr := GetText(ObjHandle); Counter := Str2Num(CounterStr) - 1; HideClass('CounterClass'); END; SetLabels; WriteOutput; Index:=0; SelectObj(R IN ['Lights']); LayerHandle:=FLayer; WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ((ObjHandle<>NIL) AND (NumRecords(ObjHandle)>0)) DO BEGIN FillStrings; Message(OutputStr); WriteOutput; ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} Close(ExportFile); ClrMessage; DSelectAll; SelectObj(((N='') & (T=Symbol) & ((R IN ['Lights'])))); LayerHandle:=ActLayer; UnNamedSymbols := 0; UnNamedSymbols := NumSObj(LayerHandle); IF UnNamedSymbols > 0 THEN BEGIN AlrtDialog('AutoPlot has attempted to assign a name that is already assigned.'); AlrtDialog('Run the "Erase Names" macro and re-export'); END; ObjHandle := GetObject('NameCounter'); CounterStr := Num2Str(0,Counter); SetText(ObjHandle,CounterStr); END; {IF NOT DidCancel} SysBeep; SysBeep; ClrMessage; SetCursor(ArrowC); END; {PROCEDURE WriteData} Run(WriteData); ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;A"y,'`1@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE MoveDimensions; VAR CurrentLayer:Handle; CurLayerName:String; BEGIN DoMenuText('Show/Snap/Modify Others'); DSelectAll; CurrentLayer := ActLayer; CurLayerName := GetLName(CurrentLayer); SelectObj(C='Dimension'); DoMenuText('Cut'); Layer('Dimensions'); DoMenuText('Paste In Place'); Layer(CurLayerName); DoMenuText('Show Others'); END; {Procedure Credits} Run(MoveDimensions); n;Ay,'`1@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This macro erases all the IDs in the name field of all symbols attached to the record lights and replaces it with a negative number. This action will cause a whole new and fresh set of IDs to be assigned to all the symbols on the plot during the next `Export command.} PROCEDURE EraseAllNames; VAR ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; NumberOfLights:integer; Ok:boolean; PositionStr:string; PositionMatch:string; Counter:integer; CounterStr:String; {---------------------------------------------------------} PROCEDURE FillArray(positionStr:string); VAR index:integer; RealX,RealY:REAL; noneStr:STRING; nameHolder:STRING; BEGIN NumberOfLights := 0; LayerHandle := FLayer; WHILE LayerHandle<>NIL DO BEGIN ObjHandle := FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN NumberOfLights:=NumberOfLights+1; noneStr := Num2Str(0,(NumberOfLights * (-1))); Message(noneStr); nameHolder := GetName(ObjHandle); DelName(nameHolder); SetName(ObjHandle,noneStr); ObjHandle := NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle := NextLayer(LayerHandle); END; {WHILE LayerHanel<>NIL} End; {Procedure FillArray} {---------------------------------------------------------} BEGIN {EraseAllNames} IF YNDialog('Do you wish to generate new PlotLink IDs on the next export') THEN BEGIN Message('FINDING LIGHTS'); SelectObj((T=Symbol) & (R IN ['Lights'])); FillArray(PositionStr); IF GetObject('NameCounter') = NIL THEN BEGIN TextSize(3); NameObject('NameCounter'); TextOrigin(0,0); BeginText; '32000' EndText; ObjHandle:=GetObject('NameCounter'); SetClass(ObjHandle,'CounterClass'); HideClass('CounterClass'); Counter := 32000; END ELSE BEGIN ObjHandle := GetObject('NameCounter'); SetClass(ObjHandle,'CounterClass'); SetText(ObjHandle,'32000'); HideClass('CounterClass'); Counter := 32000; END; SysBeep; END; {IF YES} ClrMessage; DSelectAll; REDRAW; END; {Procedure EraseAllNames} Run(EraseAllNames); ny,;Any,;Any,;Any,;An;AZy,1@4 {Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE SpaceFromSR; LABEL 9; CONST kFixtureSpacing = 9; VAR DlgDist:REAL; WSHan:HANDLE; ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; NumberOfLights:INTEGER; Space:REAL; X:REAL; Y:REAL; DestX:REAL; DestY:REAL; DeltaX:REAL; Ok:boolean; PositionStr:string; PositionMatch:string; {---------------------------------------------------------} PROCEDURE FillArray; VAR index:integer; realX,realY:REAL; ok:boolean; messageNum:REAL; messageStr:string; BEGIN NumberOfLights:=0; LayerHandle:=FLayer; WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN GetSymLoc(ObjHandle, realX,realY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; XArray[NumberOfLights]:= realX; Message(concat('number of lights = ',Num2Str(0,NumberOfLights))); END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END; {PROCEDURE FillArray} {---------------------------------------------------------} PROCEDURE SortArray; var index1:integer; index2:integer; objectHolder:Handle; xHolder:REAL; yHolder:REAL; noChange:boolean; BEGIN noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO BEGIN IF XArray[index1] > XArray[index2] THEN BEGIN objectHolder:=HandleArray[index2]; xHolder:=XArray[index2]; HandleArray[index2]:=HandleArray[index1]; XArray[index2]:=XArray[index1]; HandleArray[index1]:=objectHolder; XArray[index1]:=xHolder; NoChange:=False; END; {IF XArray[index1]<=XArray[index2]} END; {FOR index2:=index1+1 to NumberOfLights} {FOR index1:=1 to NumberOfLights-1} END; {PROCEDURE SortArray} {---------------------------------------------------------} PROCEDURE MoveLights; VAR index:integer; BEGIN FOR index:=1 to NumberOfLights DO BEGIN GetSymLoc(HandleArray[index],X,Y); DeltaX := DestX + ((index -1) * Space) - X; HMove(HandleArray[index], DeltaX,0); END; {FOR index:=1 to NumberOfLights} END; {PROCEDURE MoveLights} {---------------------------------------------------------} BEGIN { SpaceFromSL} DlgDist := 0; WSHan := GetObject('AutoPlot Preferences'); IF WSHan = NIL THEN BEGIN AlrtDialog('No AutoPlot Preferences worksheet found. MACRO ABORTED. Run Make Prefs macro'); GOTO 9; END; IF (CellHasNum(WSHan,kFixtureSpacing,2)) THEN DlgDist := GetCellNUM(WSHan,kFixtureSpacing,2); Space := RealDialog('Spacing in inches (if metric use drawing units', Num2Str(0,DlgDist)); Space:=ABS(Space); IF (DidCancel OR (Space = 0)) THEN GOTO 9; SelectSS(WSHan); LoadCell(kFixtureSpacing,2,Num2Str(0,Space)); CloseSS(WSHan); IF ((NOT DidCAncel) AND (Space <> 0)) THEN BEGIN Message('Click on point to align to'); GetPt(DestX,DestY); SetCursor(WatchC); Message('Filling Array'); FillArray; Message('Sorting Array'); SortArray; Message('Moving Lights'); MoveLights; ClrMessage; Redraw; SysBeep; SetCursor(ArrowC); END; { IF ((NOT DidCAncel)} 9: CloseSS(WSHan); END; {PROCEDURE SpaceFromSL} RUN(SpaceFromSR); y,'`01@ PROCEDURE MakePrefsWKS; LABEL 999; CONST kBeamAng = 3; kFieldAng = 2; kHight = 4; kFacePlane = 5; kFocusLocus = 6; kWSDist = 7; kValueCol = 2; kDrawFieldCone = 8; kFixtureSpacing = 9; kLayerState = 10; VAR WSHan:HANDLE; BEGIN WSHan := GetObject('AutoPlot Preferences'); IF WSHan = NIL THEN BEGIN SprdSheet(100,100,11,3); SprdWidth(20); WSHan := ActSSheet; SelectSS(WSHan); LoadCell(kBeamAng,1,'Beam Angle'); LoadCell(kFieldAng,1,'Field Angle'); LoadCell(kHight,1,'Position Height'); LoadCell(kFacePlane,1,'Face Plane'); LoadCell(kFocusLocus,1,'Place Focus Locus? (y,n)'); LoadCell(kWSDist,1,'Distance (Computed by Macro)'); LoadCell(kDrawFieldCone,1,'Draw Field Cone)'); LoadCell(kFixtureSpacing,1,'Fixture Spacing)'); LoadCell(kLayerState,1,'Layer State'); SprdWidth(25); LoadCell(kBeamAng,3,'Angle of 50% intensity '); LoadCell(kFieldAng,3,'Nominal beam angle'); LoadCell(kFacePlane,3,'Height above floor that you care about'); LoadCell(kFixtureSpacing,3,'Used for default in spacing macros'); LoadCell(kLayerState,3,'(Active Only, Gray Others, Show Others, etc)'); SprdWidth(10); SprdAlign(3); SprdFormat(6,0,'',''); LoadCell(kBeamAng,2,''); LoadCell(kFieldAng,2,''); SprdFormat(5,0,'',''); LoadCell(kHight,2,''); LoadCell(kFacePlane,2,'0'); SprdFormat(0,0,'',''); LoadCell(kFocusLocus,2,'Y'); SprdAlign(3); LoadCell(kWSDist,2,''); LoadCell(kFacePlane,2,''); LoadCell(kFixtureSpacing,2,'18'); LoadCell(kLayerState,2,'Show Others'); WSHan := ActSSheet; SetName(WSHan,'AutoPlot Preferences'); SelectSS(WSHan); DoMenuText('WSRecalculate'); CloseSS(WSHan); END; {IF WSHan = NIL} END; {PROCEDURE MakePrefsWKS} RUN (MakePrefsWKS); n;Ay,'`1@{Developed by Joshua Benghiat} {Modified slightly by Samuel L. Jones} { Copyright February 1998} PROCEDURE BeamSpread; LABEL 9; CONST kBeamAng = 3; kFieldAng = 2; kHight = 4; kFacePlane = 5; kFocusLocus = 6; kWSDist = 7; kValueCol = 2; kDrawFieldCone = 8; VAR S:INTEGER; H:REAL; FaceH:REAL; X,Y,Ix,Iy,D,D1,D2,R,D3,P,X1,Y1,X2,Y2,S2,CH,CD,CW,RotAng:REAL; LayerHandle,ObjHandle,RecHandle:HANDLE; FieldOvHan,BeamOvHan,ConeOvHan,ConeHan,WSHan:HANDLE; vect:VECTOR; PlaceFocus:STRING; AbortFlag:Boolean; {---------------------------------------------------------} PROCEDURE MakePrefsWKS; BEGIN SprdSheet(100,100,10,3); SprdWidth(20); LoadCell(kBeamAng,1,'Beam Angle'); LoadCell(kFieldAng,1,'Field Angle'); LoadCell(kHight,1,'Position Height'); LoadCell(kFacePlane,1,'Face Plane'); LoadCell(kFocusLocus,1,'Place Focus Locus? (y,n)'); LoadCell(kWSDist,1,'Distance (Computed by Macro)'); LoadCell(kDrawFieldCone,1,'Draw Field Cone)'); SprdWidth(25); LoadCell(kBeamAng,3,'Angle of 50% intensity '); LoadCell(kFieldAng,3,'Nominal beam angle'); LoadCell(kFacePlane,3,'Height above floor that you care about'); SprdWidth(10); SprdAlign(3); SprdFormat(6,0,'',''); LoadCell(kBeamAng,2,''); LoadCell(kFieldAng,2,''); SprdFormat(5,0,'',''); LoadCell(kHight,2,''); LoadCell(kFacePlane,2,'0'); SprdFormat(0,0,'',''); LoadCell(kFocusLocus,2,'Y'); SprdAlign(3); LoadCell(kWSDist,2,''); LoadCell(kFacePlane,2,''); WSHan := ActSSheet; SetName(WSHan,'AutoPlot Preferences'); SelectSS(WSHan); DoMenuText('WSRecalculate'); END; {PROCEDURE MakePrefsWKS} {---------------------------------------------------------} BEGIN {BeamSpread} ClrMessage; AbortFlag := FALSE; {Get Field angle} ANGLEVAR; WSHan := GetObject('AutoPlot Preferences'); IF WSHan = NIL THEN BEGIN AlrtDialog('No AutoPlot Preferences worksheet found. Macro Aborted. Run Make Prefs macro'); AbortFlag := TRUE; END ELSE IF (NOT CellHasNum(WSHan,kHight,2)) THEN BEGIN AlrtDialog('Position Height has no value. Macro Aborted'); AbortFlag := TRUE; SelectSS(WSHan); END ELSE IF (NOT CellHasNum(WSHan,kFieldAng,2)) THEN BEGIN AlrtDialog('Field angle has no value. Macro Aborted'); AbortFlag := TRUE; SelectSS(WSHan); END; IF (NOT AbortFlag) THEN BEGIN SelectSS(WSHan); S := .5 * GetCellNUM(WSHan,kFieldAng,2); NOANGLEVAR; {get height} H := 12 * GetCellNUM(WSHan,kHight,2); FaceH := 12 * GetCellNUM(WSHan,kFacePlane,2); IF FaceH >= H THEN BEGIN AlrtDialog('The Face Hight is at the same level or higher than the fixture'); SprdFormat(5,0,'',''); LoadCell(kFacePlane,2,''); DoMenuText('WSRecalculate'); AlrtDialog('The Fach Hight has been set to floor level, 0'); FaceH := 0; END; H := H - FaceH; SetCursor(WatchC); LayerHandle := ActLayer; ObjHandle := FSObject(LayerHandle); IF ObjHandle=NIL THEN sysbeep; Message('Select an Instrument'); IF GetType(ObjHandle)=15 THEN BEGIN RecHandle := GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN Message('Click on Focus Point'); Redraw; GetSymLoc(ObjHandle,Ix,IY); GetPt(X,Y); IF CellHasNum(WSHan,kFieldAng,2) THEN BEGIN D := Distance(Ix,IY,X,Y); SelectSS(WSHan); LoadCell(7,2,Num2StrF(Sqrt(H^2 + D^2))); S2 := Deg2Rad(S); D2 := H * tan(ArcTan(D/H) + S2); D1 := H * tan(ArcTan(D/H) - S2); D3 := .5 * (D2 - D1); P := 2; R := Sqrt((D3^2 * (H^2 + D^2) * (tan(S2))^2)/( - (D1 - D) * (P * D3 + D1 - D))); X1 := Ix - R; X2 := Ix + R; Y1 := Iy + D2; Y2 := Iy + D1; Oval(X1,Y1,X2,Y2); DSelectAll; FieldOvHan := LNewObj; vect[1] := X - Ix; vect[2] := y - Iy; vect[3] := 0; RotAng := Vec2Ang(vect) - 90; SetSelect(FieldOvHan); RotatePoint(Ix,Iy,RotAng); SetFPat(FieldOvHan,0); END; {compute with Beam angle} IF CellHasNum(WSHan,kBeamAng,2) THEN BEGIN {get field angle} ANGLEVAR; S := .5 * GetCellNUM(WSHan,3,2); NOANGLEVAR; S2 := Deg2Rad(S); D2 := H * tan(ArcTan(D/H) + S2); D1 := H * tan(ArcTan(D/H) - S2); D3 := .5 * (D2 - D1); P := 2; R := Sqrt((D3^2 * (H^2 + D^2) * (tan(S2))^2)/( - (D1 - D) * (P * D3 + D1 - D))); X1 := Ix - R; X2 := Ix + R; Y1 := Iy + D2; Y2 := Iy + D1; PushAttrs; PenPat(-2); Oval(X1,Y1,X2,Y2); DSelectAll; PopAttrs; BeamOvHan := LNewObj; SetSelect(BeamOvHan); RotatePoint(Ix,Iy,RotAng); SetFPat(BeamOvHan,0); END; {IF CellHasNum(WSHan,kBeamAng,2)} IF ((GetCellSTR(WSHan,kDrawFieldCone,2)='y') OR (GetCellSTR(WSHan,kDrawFieldCone,2)='Y')) THEN BEGIN DSelectAll; X1 := Ix-1; Y1 := IY+1; X1 := Ix+1; Y1 := IY-1; Oval(IX-1,IY+1,IX+1,IY-1); ConeOvHan := LNewObj; DSelectAll; SetSelect(FieldOvHan); SetSelect(ConeOvHan); DoMenuText('Multiple Extrude'); ConeHan := LSActLayer; DSelectAll; Get3DInfo(ConeHan,CH,CW,CD); Set3DInfo(ConeHan,CH,CW,H); REDRAW; SetSelect(ConeHan); END; {Place Focus Locus} IF (GetCellSTR(WSHan,kFocusLocus,2)='y') THEN Locus(X,Y) ELSE IF (GetCellSTR(WSHan,kFocusLocus,2)='Y') THEN Locus(X,Y); Group; DSelectAll; SetSelect(ObjHandle); REDRAW; END {IF (RecHandle<>NIL)} ELSE BEGIN SysBeep; AlrtDialog('Object Selected is not a lighting fixture symbol'); Message('To Run Beam Spread WKS: Select an fixture'); END; END {IF GetType(ObjHandle)=15} ELSE {Selected Object not a symbol} BEGIN SysBeep; AlrtDialog('Object Selected is not a lighting fixture symbol'); Message('To Run Beam Spread WKS: Select an fixture'); END; {ELSE Selected Object not a symbol} ClrMessage; SetCursor(ArrowC); Redraw; END; {IF not AbortFlag } 9: END; {Procedure BeamSpread} RUN(BeamSpread); ny,;An;A y,1@ {Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE SpaceFromTop; LABEL 9; CONST kFixtureSpacing = 9; VAR DlgDist:REAL; WSHan:HANDLE; ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; YArray:array[1..100] of REAL; NumberOfLights:INTEGER; Space:REAL; Spread:REAL; X:REAL; Y:REAL; DestX:REAL; DestY:REAL; DeltaY:REAL; Ok:boolean; PositionStr:string; PositionMatch:string; {---------------------------------------------------------} PROCEDURE FillArray; VAR index:integer; realX,realY:REAL; ok:boolean; messageNum:REAL; messageStr:string; BEGIN NumberOfLights:=0; LayerHandle:=FLayer; WHILE LayerHandle<>NIL DO BEGIN ObjHandle:=FSObject(LayerHandle); WHILE ObjHandle<>NIL DO BEGIN IF GetType(ObjHandle)=15 THEN BEGIN RecHandle:=GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN GetSymLoc(ObjHandle, realX,realY); NumberOfLights:=NumberOfLights+1; HandleArray[NumberOfLights]:=ObjHandle; YArray[NumberOfLights]:= realY; END; {IF (RecHandle<>NIL)} END; {IF GetType(x)=15} ObjHandle:=NextSObj(ObjHandle); END; {WHILE ObjHandle<>NIL} LayerHandle:=NextLayer(LayerHandle); END; {WHILE LayerHandle<>NIL} END; {PROCEDURE FillArray} {---------------------------------------------------------} PROCEDURE SortArray; VAR index1:integer; index2:integer; objectHolder:Handle; yHolder:REAL; noChange:boolean; BEGIN noChange:=True; FOR index1:=1 to NumberOfLights-1 DO FOR index2:=index1+1 to NumberOfLights DO BEGIN IF YArray[index1] > YArray[index2] THEN BEGIN objectHolder:=HandleArray[index2]; yHolder:=YArray[index2]; HandleArray[index2]:=HandleArray[index1]; YArray[index2]:=YArray[index1]; HandleArray[index1]:=objectHolder; YArray[index1]:=yHolder; noChange:=False; END; {IF YArray[index1]<=YArray[index2]} END; {FOR index2:=index1+1 to NumberOfLights} {FOR index1:=1 to NumberOfLights-1} END; {PROCEDURE SortArray} {---------------------------------------------------------} PROCEDURE MoveLights; VAR index:integer; BEGIN FOR index:=1 to NumberOfLights DO BEGIN GetSymLoc( HandleArray[index],X,Y); DeltaY:=DestY-Y+((index -1) * Space)); HMove( HandleArray[index],0,DeltaY); END; {FOR index:=1 to NumberOfLights} END; {PROCEDURE MoveLights} {---------------------------------------------------------} BEGIN {SpaceFromTop} DlgDist := 0; WSHan := GetObject('AutoPlot Preferences'); IF WSHan = NIL THEN BEGIN AlrtDialog('No AutoPlot Preferences worksheet found. MACRO ABORTED. Run Make Prefs macro'); GOTO 9; END; IF (CellHasNum(WSHan,kFixtureSpacing,2)) THEN DlgDist := GetCellNUM(WSHan,kFixtureSpacing,2); Space := RealDialog('Spacing in inches (if metric use drawing units', Num2Str(0,DlgDist)); Space:=ABS(Space); IF (DidCancel OR (Space = 0)) THEN GOTO 9; SelectSS(WSHan); LoadCell(kFixtureSpacing,2,Num2Str(0,Space)); CloseSS(WSHan); Space:=ABS(Space); Message('Click on point to align to'); GetPt(DestX,DestY); SetCursor(WatchC); Message('Filling Array'); FillArray; Message('Sorting Array'); SortArray; Message('Moving Lights'); MoveLights; Message('Redrawing Screen'); Redraw; ClrMessage; SysBeep; SetCursor(ArrowC); 9: CloseSS(WSHan); END; {PROCEDURE SpaceFromTop} RUN( SpaceFromTop); y,'`$1@PROCEDURE SetHeightForSelected; VAR DestHeight:Real; PROCEDURE SetHeight(objHandle:Handle); VAR x,y,z,deltaZ:REAL; BEGIN Get3DCntr(objHandle,x,y,z); deltaZ := DestHeight - z; Move3DObj(objHandle,0,0,deltaZ); END; BEGIN DestHeight := 12 * RealDialog('Enter Height in feet','0'); ForEachObject(SetHeight, ((SEL=TRUE))); END; RUN(SetHeightForSelected); ny,;Any,;Any,;Any,;An;A=y,1@SelectObj((S='*6x9*'));>y,1@SelectObj((S='*6x12*'));>y,1@SelectObj((S='*6x16*'));y,'`L1@ {Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This Macro replaces selected lights with the currently selected} {symbol, retaining the original database info} PROCEDURE ReplaceSymbol; var SymbolObjects:Array[1..50] of Handle; ObjHandle: Handle; LayerHandle:Handle; Ok:boolean; SymbolName:string; SymRot:Real; X,Y:Real; Index:integer; Unit,Pos,Cir,Chan,Color,Dim,Watt,Type,Temp:string; Purp,ShortPurp,Misc1,Misc2,SymName:string; StringNumber:string; {--------------------------------------------------------------} PROCEDURE FillSymbolArray; VAR objectHandle:Handle; stringNumber:string; BEGIN FOR Index:=1 to 25 DO SymbolObjects[Index]:=NIL; Index:=0; LayerHandle:=ActLayer; objectHandle:=FSObject(LayerHandle); WHILE objectHandle<>NIL DO BEGIN IF (GetType(objectHandle)=15) THEN BEGIN Index:=Index+1; SymbolObjects[Index]:=objectHandle; END; {IF ((GetType(ObjHandle)=15)} objectHandle:=NextSObj(objectHandle); END; {WHILE objectHandle<>NIL} DSelectAll; Message('Leaving FillSymbolArray'); END; {PROCEDURE FillSymbolArray} {--------------------------------------------------------------} PROCEDURE PickUpDataStrings(objectHandle:Handle); BEGIN Unit:=EvalStr(objectHandle,('Lights'.'Unit #')); Pos:=EvalStr(objectHandle,('Lights'.'Position')); Chan:=EvalStr(objectHandle,('Lights'.'Channel')); Purp:=EvalStr(objectHandle,('Lights'.'Purpose')); Color:=EvalStr(objectHandle,('Lights'.'Color')); Cir:=EvalStr(objectHandle,('Lights'.'Circuit')); Dim:=EvalStr(objectHandle,('Lights'.'Dimmer')); { Watt:=EvalStr(objectHandle,('Lights'.'Wattage')); use new symbol data } { Type:=EvalStr(objectHandle,('Lights'.'Type')); use new symbol data } Temp:=EvalStr(objectHandle,('Lights'.'Template')); ShortPurp:=EvalStr(objectHandle,('Lights'.'Short Purp')); Misc1:=EvalStr(objectHandle,('Lights'.'Miscl#1')); Misc2:=EvalStr(objectHandle,('Lights'.'Miscl#2')); SymName:=GetName(objectHandle); END; {Procedure PickUpDataStrings} {--------------------------------------------------------------} PROCEDURE PutDownDataStrings; VAR objectHandle:Handle; BEGIN objectHandle:= LNewObj; SetRField(objectHandle,'Lights', 'Unit #', Unit); SetRField(objectHandle,'Lights', 'Position', Pos); SetRField(objectHandle,'Lights', 'Channel', Chan); SetRField(objectHandle,'Lights', 'Purpose', Purp); SetRField(objectHandle,'Lights', 'Color', Color); SetRField(objectHandle,'Lights', 'Circuit', Cir); SetRField(objectHandle,'Lights', 'Dimmer', Dim); { SetRField(objectHandle,'Lights', 'Wattage', Watt); use new symbol data } { SetRField(objectHandle,'Lights', 'Type', Type); use new symbol data } SetRField(objectHandle,'Lights', 'Template', Temp); SetRField(objectHandle,'Lights', 'Short Purp', ShortPurp); SetRField(objectHandle,'Lights', 'Miscl#1', Misc1); SetRField(objectHandle,'Lights', 'Miscl#2', Misc2); IF SymName<>'none' THEN SetName(ObjHandle,SymName); END; {PROCEDURE PutDownDataStrings} {--------------------------------------------------------------} BEGIN {* DoMenu(1387, NoKey); *} SetCursor(WatchC); ObjHandle:=ActSymDef; SymbolName:=GetSDName(ObjHandle); IF SymbolName<>'' THEN BEGIN FillSymbolArray; Index:=1; WHILE ((SymbolObjects[Index]<>NIL) AND (Index<26)) DO BEGIN ObjHandle:=SymbolObjects[Index]; PickUpDataStrings(ObjHandle); GetSymLoc(ObjHandle,X,Y); SymRot:= GetSymRot(ObjHandle); DelObject(ObjHandle); Symbol(SymbolName, X, Y, SymRot); PutDownDataStrings; Index:=Index+1; END; {WHILE ((SymbolObjects[Index]<>NIL)} END {IF SymbolName<>''} ELSE AlrtDialog('No New Symbol is active'); ClrMessage; SetCursor(ArrowC); END; {PROCEDURE ReplaceSymbol} Run(ReplaceSymbol); ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;Ay,'`1@{{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This Procedure draws the two sides of a beam's spread centered on a line that you have already drawn and selected} PROCEDURE BeamSection; VAR ObjHandle:Handle; Edge1,Edge2:Handle; AngleOfThrow:REAL; LightX,LightY:REAL; FootX,FootY:REAL; DupX,DupY:REAL; DiffX,DiffY:REAL; AngleOfSpread:REAL; BEGIN PushAttrs; ObjHandle:=FSActLayer; IF ((ObjHandle <> NIL) AND (GetType(ObjHandle)=2)) THEN BEGIN AngleOfSpread:=AngDialog('Beam Spread', '36'); AngleOfSpread:=AngleOfSpread/2; GetSegPt1(ObjHandle,LightX,LightY); GetSegPt2(ObjHandle,FootX,FootY); SetDSelect(ObjHandle); ArrowHead(2); MoveTo(LightX,LightY); LineTo(FootX,FootY); Edge1:=FSActLayer; SetDSelect(Edge1); ArrowHead(2); MoveTo(LightX,LightY); LineTo(FootX,FootY); Edge2:=FSActLayer; SetDSelect(Edge2); SetSelect(Edge1); GetSegPt1(Edge1,DupX,DupY); ANGLEVAR; Rotate(#AngleOfSpread); NOANGLEVAR; GetSegPt1(Edge1,DupX,DupY); DiffX:=LightX-DupX; DiffY:=LightY-DupY; MoveObjs(DiffX, DiffY, FALSE, FALSE); SetDSelect(Edge1); SetSelect(Edge2); ANGLEVAR; AngleOfSpread:=AngleOfSpread*(-1); Rotate(#AngleOfSpread); NOANGLEVAR; GetSegPt1(Edge2,DupX,DupY); DiffX:=LightX-DupX; DiffY:=LightY-DupY; MoveObjs(DiffX, DiffY, FALSE, FALSE); SetSelect(Edge1); SetSelect(Edge2); PopAttrs; SetTool(2); Redraw; END {IF ObjHandle <> NIL} ELSE AlrtDialog('You must draw & select a line from the source to the destination first, then activate Beam Section'); END; {PROCEDURE BeamSection} RUN(BeamSection); ny,;Any,;Any,;Any,;Any,;An;Ay,'`1@ {Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This Macro replaces selected lights with the currently selected} {symbol, retaining the original database info} PROCEDURE ReplaceSymbol; var SymbolObjects:Array[1..50] of Handle; ObjHandle: Handle; LayerHandle:Handle; Ok:boolean; SymbolName:string; SymRot:Real; X,Y:Real; Index:integer; Unit,Pos,Cir,Chan,Color,Dim,Watt,Type,Temp:string; Purp,ShortPurp,Misc1,Misc2,SymName:string; StringNumber:string; {--------------------------------------------------------------} PROCEDURE FillSymbolArray; VAR objectHandle:Handle; stringNumber:string; BEGIN FOR Index:=1 to 25 DO SymbolObjects[Index]:=NIL; Index:=0; LayerHandle:=ActLayer; objectHandle:=FSObject(LayerHandle); WHILE objectHandle<>NIL DO BEGIN IF (GetType(objectHandle)=15) THEN BEGIN Index:=Index+1; SymbolObjects[Index]:=objectHandle; END; {IF ((GetType(ObjHandle)=15)} objectHandle:=NextSObj(objectHandle); END; {WHILE objectHandle<>NIL} DSelectAll; Message('Leaving FillSymbolArray'); END; {PROCEDURE FillSymbolArray} {--------------------------------------------------------------} PROCEDURE PickUpDataStrings(objectHandle:Handle); BEGIN Unit:=EvalStr(objectHandle,('Lights'.'Unit #')); Pos:=EvalStr(objectHandle,('Lights'.'Position')); Chan:=EvalStr(objectHandle,('Lights'.'Channel')); Purp:=EvalStr(objectHandle,('Lights'.'Purpose')); Color:=EvalStr(objectHandle,('Lights'.'Color')); Cir:=EvalStr(objectHandle,('Lights'.'Circuit')); Dim:=EvalStr(objectHandle,('Lights'.'Dimmer')); { Watt:=EvalStr(objectHandle,('Lights'.'Wattage')); use new symbol data } { Type:=EvalStr(objectHandle,('Lights'.'Type')); use new symbol data } Temp:=EvalStr(objectHandle,('Lights'.'Template')); ShortPurp:=EvalStr(objectHandle,('Lights'.'Short Purp')); Misc1:=EvalStr(objectHandle,('Lights'.'Miscl#1')); Misc2:=EvalStr(objectHandle,('Lights'.'Miscl#2')); SymName:=GetName(objectHandle); END; {Procedure PickUpDataStrings} {--------------------------------------------------------------} PROCEDURE PutDownDataStrings; VAR objectHandle:Handle; BEGIN objectHandle:= LNewObj; SetRField(objectHandle,'Lights', 'Unit #', Unit); SetRField(objectHandle,'Lights', 'Position', Pos); SetRField(objectHandle,'Lights', 'Channel', Chan); SetRField(objectHandle,'Lights', 'Purpose', Purp); SetRField(objectHandle,'Lights', 'Color', Color); SetRField(objectHandle,'Lights', 'Circuit', Cir); SetRField(objectHandle,'Lights', 'Dimmer', Dim); { SetRField(objectHandle,'Lights', 'Wattage', Watt); use new symbol data } { SetRField(objectHandle,'Lights', 'Type', Type); use new symbol data } SetRField(objectHandle,'Lights', 'Template', Temp); SetRField(objectHandle,'Lights', 'Short Purp', ShortPurp); SetRField(objectHandle,'Lights', 'Miscl#1', Misc1); SetRField(objectHandle,'Lights', 'Miscl#2', Misc2); IF SymName<>'none' THEN SetName(ObjHandle,SymName); END; {PROCEDURE PutDownDataStrings} {--------------------------------------------------------------} BEGIN {* DoMenu(1387, NoKey); *} SetCursor(WatchC); ObjHandle:=ActSymDef; SymbolName:=GetSDName(ObjHandle); IF SymbolName<>'' THEN BEGIN FillSymbolArray; Index:=1; WHILE ((SymbolObjects[Index]<>NIL) AND (Index<26)) DO BEGIN ObjHandle:=SymbolObjects[Index]; PickUpDataStrings(ObjHandle); GetSymLoc(ObjHandle,X,Y); SymRot:= GetSymRot(ObjHandle); DelObject(ObjHandle); Symbol(SymbolName, X, Y, SymRot); PutDownDataStrings; Index:=Index+1; END; {WHILE ((SymbolObjects[Index]<>NIL)} END {IF SymbolName<>''} ELSE AlrtDialog('No New Symbol is active'); ClrMessage; SetCursor(ArrowC); END; {PROCEDURE ReplaceSymbol} Run(ReplaceSymbol); ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;Ay,'`1@ {Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} {This Macro replaces selected lights with the currently selected} {symbol, retaining the original database info} PROCEDURE ReplaceSymbol; var SymbolObjects:Array[1..50] of Handle; ObjHandle: Handle; LayerHandle:Handle; Ok:boolean; SymbolName:string; SymRot:Real; X,Y:Real; Index:integer; Unit,Pos,Cir,Chan,Color,Dim,Watt,Type,Temp:string; Purp,ShortPurp,Misc1,Misc2,SymName:string; StringNumber:string; {--------------------------------------------------------------} PROCEDURE FillSymbolArray; VAR objectHandle:Handle; stringNumber:string; BEGIN FOR Index:=1 to 25 DO SymbolObjects[Index]:=NIL; Index:=0; LayerHandle:=ActLayer; objectHandle:=FSObject(LayerHandle); WHILE objectHandle<>NIL DO BEGIN IF (GetType(objectHandle)=15) THEN BEGIN Index:=Index+1; SymbolObjects[Index]:=objectHandle; END; {IF ((GetType(ObjHandle)=15)} objectHandle:=NextSObj(objectHandle); END; {WHILE objectHandle<>NIL} DSelectAll; Message('Leaving FillSymbolArray'); END; {PROCEDURE FillSymbolArray} {--------------------------------------------------------------} PROCEDURE PickUpDataStrings(objectHandle:Handle); BEGIN Unit:=EvalStr(objectHandle,('Lights'.'Unit #')); Pos:=EvalStr(objectHandle,('Lights'.'Position')); Chan:=EvalStr(objectHandle,('Lights'.'Channel')); Purp:=EvalStr(objectHandle,('Lights'.'Purpose')); Color:=EvalStr(objectHandle,('Lights'.'Color')); Cir:=EvalStr(objectHandle,('Lights'.'Circuit')); Dim:=EvalStr(objectHandle,('Lights'.'Dimmer')); { Watt:=EvalStr(objectHandle,('Lights'.'Wattage')); use new symbol data } { Type:=EvalStr(objectHandle,('Lights'.'Type')); use new symbol data } Temp:=EvalStr(objectHandle,('Lights'.'Template')); ShortPurp:=EvalStr(objectHandle,('Lights'.'Short Purp')); Misc1:=EvalStr(objectHandle,('Lights'.'Miscl#1')); Misc2:=EvalStr(objectHandle,('Lights'.'Miscl#2')); SymName:=GetName(objectHandle); END; {Procedure PickUpDataStrings} {--------------------------------------------------------------} PROCEDURE PutDownDataStrings; VAR objectHandle:Handle; BEGIN objectHandle:= LNewObj; SetRField(objectHandle,'Lights', 'Unit #', Unit); SetRField(objectHandle,'Lights', 'Position', Pos); SetRField(objectHandle,'Lights', 'Channel', Chan); SetRField(objectHandle,'Lights', 'Purpose', Purp); SetRField(objectHandle,'Lights', 'Color', Color); SetRField(objectHandle,'Lights', 'Circuit', Cir); SetRField(objectHandle,'Lights', 'Dimmer', Dim); { SetRField(objectHandle,'Lights', 'Wattage', Watt); use new symbol data } { SetRField(objectHandle,'Lights', 'Type', Type); use new symbol data } SetRField(objectHandle,'Lights', 'Template', Temp); SetRField(objectHandle,'Lights', 'Short Purp', ShortPurp); SetRField(objectHandle,'Lights', 'Miscl#1', Misc1); SetRField(objectHandle,'Lights', 'Miscl#2', Misc2); IF SymName<>'none' THEN SetName(ObjHandle,SymName); END; {PROCEDURE PutDownDataStrings} {--------------------------------------------------------------} BEGIN {* DoMenu(1387, NoKey); *} SetCursor(WatchC); ObjHandle:=ActSymDef; SymbolName:=GetSDName(ObjHandle); IF SymbolName<>'' THEN BEGIN FillSymbolArray; Index:=1; WHILE ((SymbolObjects[Index]<>NIL) AND (Index<26)) DO BEGIN ObjHandle:=SymbolObjects[Index]; PickUpDataStrings(ObjHandle); GetSymLoc(ObjHandle,X,Y); SymRot:= GetSymRot(ObjHandle); DelObject(ObjHandle); Symbol(SymbolName, X, Y, SymRot); PutDownDataStrings; Index:=Index+1; END; {WHILE ((SymbolObjects[Index]<>NIL)} END {IF SymbolName<>''} ELSE AlrtDialog('No New Symbol is active'); ClrMessage; SetCursor(ArrowC); END; {PROCEDURE ReplaceSymbol} Run(ReplaceSymbol); ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;A$~Ty,3@GG,@'`|'` #y,'`1@PROCEDURE Distribute; VAR o : Handle; a,d,m,f,g,h,i,j,k : Real; t : INTEGER; {***************************************} {* Procedure Distribute evenly distributes all selected *} {* objects on the active layer along a line *} {* provided by the user. *} {***************************************} BEGIN IF (NumSObj(ActLayer) > 1) THEN BEGIN AngleVar; o := FSActLayer; Message('Draw distribution line'); GetLine(m,f,g,h); ClrMessage; IF m = g THEN a := 90 ELSE a := ArcTan((h - f)/(g - m)) * 180/pi; d := Distance(m,f,g,h)/(NumSObj(ActLayer) - 1); IF ((a = 90) & (h < f)) OR (g < m) THEN d := -d; MoveTo(m,f); WHILE o <> NIL DO BEGIN t := GetType(o); IF t < 24 THEN HCenter(o,i,j) ELSE Get3DCntr(o,i,j,k); HMove(o,m - i,f - j); o := NextSObj(o); MoveTo(d,#a); PenLoc(m,f); END; Redraw; END ELSE BEGIN Sysbeep; AlrtDialog('Not enough objects are selected.'); END; END; RUN(Distribute); ny,;Any,;Any,;Any,;Any,;An;Ay,'`1@PROCEDURE Distribute; VAR o : Handle; a,d,m,f,g,h,i,j,k : Real; t : INTEGER; {***************************************} {* Procedure Distribute evenly distributes all selected *} {* objects on the active layer along a line provided by the *} {* user. The original code by Dave Rock has been modified *} {* to space the first and last objects one half the *} {* spacing interval from the ends within the provided line.*} {***************************************} BEGIN IF (NumSObj(ActLayer) > 1) THEN BEGIN AngleVar; o := FSActLayer; Message('Draw distribution line'); GetLine(m,f,g,h); ClrMessage; IF m = g THEN a := 90 ELSE a := ArcTan((h - f)/(g - m)) * 180/pi; d := Distance(m,f,g,h)/NumSObj(ActLayer); IF ((a = 90) & (h < f)) OR (g < m) THEN d := -d; MoveTo(m,f); MoveTo(d/2,#a); PenLoc(m,f); WHILE o <> NIL DO BEGIN t := GetType(o); IF t < 24 THEN HCenter(o,i,j) ELSE Get3DCntr(o,i,j,k); HMove(o,m - i,f - j); o := NextSObj(o); MoveTo(d,#a); PenLoc(m,f); END; Redraw; END ELSE BEGIN Sysbeep; AlrtDialog('No objects are selected.'); END; END; RUN(Distribute); ny,;Any,;Any,;An;Ay,'`1@`{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE SelectByPositionExample; VAR ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; HandleArray:array[1..100] of Handle; XArray:array[1..100] of REAL; YArray:array[1..100] of REAL; NumberOfLights:integer; UnitNumber:integer; Ok:boolean; PositionStr:string; PositionMatch:string; MsgStr:string; X1,Y1,X2,Y2:REAL; {---------------------------------------------------------} Procedure GetObjectPosition(var theObject:Handle); Begin PositionStr := EvalStr(theObject,('Lights'.'Position')); Ok := YNDialog(Concat('Position is ',PositionStr)); IF (not ok) THEN theObject := NIL; End; {Procedure GetObjectPosition} {---------------------------------------------------------} BEGIN {NumberUnitsAtPosition} ObjHandle := FSActLayer; DSelectAll; IF ObjHandle <> NIL THEN BEGIN GetObjectPosition(ObjHandle); IF Ok THEN BEGIN SetCursor(WatchC); Message('Looking for lights'); SelectObj(('Lights'.'Position'=PositionStr)); SysBeep; SysBeep; END ELSE AlrtDialog('No Selected lighting symbols on the Active layer'); END ELSE AlrtDialog('No Selected objects on the Active layer'); SetCursor(ArrowC); ClrMessage; END; {PROCEDURE SelectByPositionExample} Run(SelectByPositionExample); ny,;Any,;Any,;An;Ay,1@]{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE SelectByTypeExample; LABEL 9; CONST kLayerStateRow = 10; VAR ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; Ok:boolean; TypeStr:string; PositionMatch:string; MsgStr:string; LayerState:string; WSHan:Handle; {---------------------------------------------------------} Procedure GetObjectPosition(var theObject:Handle); Begin TypeStr := EvalStr(theObject,('Lights'.'Type')); Ok := YNDialog(Concat('Type is ',TypeStr)); IF (not ok) THEN theObject := NIL; End; {Procedure GetObjectPosition} {---------------------------------------------------------} BEGIN {NumberUnitsAtPosition} ObjHandle := FSActLayer; WSHan := GetObject('AutoPlot Preferences'); IF WSHan = NIL THEN BEGIN AlrtDialog('No AutoPlot Preferences worksheet found. MACRO ABORTED. Run Make Prefs macro'); GOTO 9; END; IF (CellHasStr(WSHan,kLayerStateRow,2)) THEN LayerState := GetCellStr(WSHan,kLayerStateRow,2) Else LayerState := 'Show Others'; DoMenuText('Show/Snap/Modify Others'); DSelectAll; IF ObjHandle <> NIL THEN BEGIN GetObjectPosition(ObjHandle); IF Ok THEN BEGIN SetCursor(WatchC); Message('Looking for lights'); SelectObj(('Lights'.'Type'=TypeStr)); SysBeep; SysBeep; END ELSE AlrtDialog('No Selected lighting symbols on the Active layer'); END ELSE AlrtDialog('No Selected objects on the Active layer'); DoMenuText(LayerState); 9: ClrMessage; SetCursor(ArrowC); END; {PROCEDURE SelectByTypeExample} Run(SelectByTypeExample); Hy,'`1@"{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE SelectByPositTypeExample; VAR ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; Ok:boolean; PositionStr:string; TypeStr:string; MsgStr:string; {---------------------------------------------------------} Procedure GetObjectPosition(var theObject:Handle); Begin PositionStr := EvalStr(theObject,('Lights'.'Position')); Ok := YNDialog(Concat('Position is ',PositionStr)); IF (not ok) THEN theObject := NIL; End; {Procedure GetObjectPosition} {---------------------------------------------------------} Procedure GetObjectType(var theObject:Handle); Begin TypeStr := EvalStr(theObject,('Lights'.'Type')); Ok := YNDialog(Concat('Type is ',TypeStr)); IF (not ok) THEN theObject := NIL; End; {Procedure GetObjectPosition} {---------------------------------------------------------} BEGIN {NumberUnitsAtPosition} ObjHandle := FSActLayer; DSelectAll; IF ObjHandle <> NIL THEN BEGIN GetObjectPosition(ObjHandle); IF Ok THEN BEGIN GetObjectType(ObjHandle); IF Ok THEN BEGIN SetCursor(WatchC); Message('Looking for lights'); SelectObj((('Lights'.'Position'=PositionStr) & ('Lights'.'Type'=TypeStr))); SysBeep; END; END ELSE AlrtDialog('No Selected lighting symbols on the Active layer'); END ELSE AlrtDialog('No Selected objects on the Active layer'); ClrMessage; SetCursor(ArrowC); END; {PROCEDURE SelectByPositTypeExample} Run(SelectByPositTypeExample); ny,;Any,;An;Ay,'`1@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE SelectByChannelExample; VAR ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; Ok:boolean; ChannelStr:string; PositionMatch:string; MsgStr:string; {---------------------------------------------------------} Procedure GetObjectPosition(var theObject:Handle); Begin ChannelStr := EvalStr(theObject,('Lights'.'Channel')); Ok := YNDialog(Concat('Channel is ',ChannelStr)); IF (not ok) THEN theObject := NIL; End; {Procedure GetObjectPosition} {---------------------------------------------------------} BEGIN {NumberUnitsAtPosition} ObjHandle := FSActLayer; DSelectAll; IF ObjHandle <> NIL THEN BEGIN GetObjectPosition(ObjHandle); IF Ok THEN BEGIN SetCursor(WatchC); Message('Looking for lights'); SelectObj(('Lights'.'Channel'=ChannelStr)); SysBeep; SysBeep; END ELSE AlrtDialog('No Selected lighting symbols on the Active layer'); END ELSE AlrtDialog('No Selected objects on the Active layer'); ClrMessage; SetCursor(ArrowC); END; {PROCEDURE SelectByTypeExample} Run(SelectByChannelExample); n;Ay,'`1@{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE SelectByCircuitExample; VAR ObjHandle:Handle; LayerHandle:Handle; RecHandle:Handle; Ok:boolean; CircuitStr:string; PositionMatch:string; MsgStr:string; {---------------------------------------------------------} Procedure GetObjectPosition(var theObject:Handle); Begin CircuitStr := EvalStr(theObject,('Lights'.'Circuit')); Ok := YNDialog(Concat('Circuit is ',CircuitStr)); IF (not ok) THEN theObject := NIL; End; {Procedure GetObjectPosition} {---------------------------------------------------------} BEGIN {NumberUnitsAtPosition} ObjHandle := FSActLayer; DSelectAll; IF ObjHandle <> NIL THEN BEGIN GetObjectPosition(ObjHandle); IF Ok THEN BEGIN SetCursor(WatchC); Message('Looking for lights'); SelectObj(('Lights'.'Circuit'=CircuitStr)); SysBeep; SysBeep; END ELSE AlrtDialog('No Selected lighting symbols on the Active layer'); END ELSE AlrtDialog('No Selected objects on the Active layer'); ClrMessage; SetCursor(ArrowC); END; {PROCEDURE SelectByTypeExample} Run(SelectByCircuitExample); ny,;An;A Uy,'`1@ /{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE Distribute; VAR ObjHandle : Handle; a,d,m,f,g,h,i,j,k : Real; t : INTEGER; NumOfObjs:INTEGER; HandleArray:array[1..100] of Handle; NumArray:array[1..100] of INTEGER; Index:INTEGER; RecHandle:Handle; SymAngle:Real; RotateObjects:boolean; MissingNumber:boolean; {-------------------------------------------------------} PROCEDURE FillArray; VAR unitNum:Real; unitStr:string; BEGIN MissingNumber := False; NumOfObjs := 0; ObjHandle := FSActLayer; WHILE ObjHandle <> NIL DO BEGIN IF GetType(ObjHandle) = 15 THEN BEGIN RecHandle := GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN NumOfObjs := NumOfObjs + 1; unitStr := EvalStr(ObjHandle, ('Lights'.'Unit #')); IF unitStr = '' THEN MissingNumber := True ELSE BEGIN unitNum := Str2Num(unitStr); HandleArray[NumOfObjs] := ObjHandle; NumArray[NumOfObjs] := unitNum; END; END; {IF (RecHandle<>NIL)} END; {IF GetType(ObjHandle) = 15 } IF MissingNumber THEN ObjHandle := NIL ELSE ObjHandle := NextSObj(ObjHandle); END; {WHILE ObjHandle <> NIL} END; {FillArray} {-------------------------------------------------------} PROCEDURE SortArray; VAR index1,index2:INTEGER; num1,num2:INTEGER; objectHolder:Handle; numHolder:INTEGER; BEGIN index1 := 1; FOR index1 := 1 TO NumOfObjs - 1 DO BEGIN FOR index2 := index1 +1 TO NumOfObjs DO BEGIN IF NumArray[index1] > NumArray[index2] THEN BEGIN objectHolder := HandleArray[index2]; numHolder := NumArray[index2]; HandleArray[index2] := HandleArray[index1]; NumArray[index2] := NumArray[index1]; HandleArray[index1] := objectHolder; NumArray[index1] := numHolder; END; {IF NumArray[index1] < NumArray[index2]} END; {FOR index2} END; {FOR index1} END; {SortArray} {-------------------------------------------------------} BEGIN IF (NumSObj(ActLayer) > 1) THEN BEGIN RotateObjects := YNDialog('Rotate Symbols Perpendicular to the line?'); FOR Index := 1 TO 100 DO BEGIN HandleArray[Index] := NIL; NumArray[Index] := 0; END; AngleVar; ObjHandle := FSActLayer; Message('Draw distribution line'); GetLine(m,f,g,h); ClrMessage; IF m = g THEN a := 90 ELSE a := ArcTan((h - f)/(g - m)) * 180/pi; d := Distance(m,f,g,h)/(NumSObj(ActLayer) - 1); IF ((a = 90) & (h < f)) OR (g < m) THEN d := -d; MoveTo(m,f); FillArray; IF (NOT MissingNumber) THEN BEGIN SortArray; FOR Index := 1 TO NumOfObjs DO BEGIN ObjHandle := HandleArray[Index]; GetSymLoc(ObjHandle,i,j); SymAngle := GetSymRot(ObjHandle); HMove(ObjHandle,m - i,f - j); MoveTo(d,#a); DSelectAll; IF RotateObjects THEN BEGIN SetSelect(ObjHandle); Rotate(#a-SymAngle); END; PenLoc(m,f); END; {FOR Index := 1 TO NumOfObjs} Redraw; END {IF (NOT MissingNumber)} ELSE BEGIN Sysbeep; AlrtDialog('At least one symbol is not numbered.'); END; END {IF (NumSObj(ActLayer) > 1)} ELSE BEGIN Sysbeep; AlrtDialog('Not enough objects are selected.'); END; FOR Index := 1 TO 100 DO BEGIN HandleArray[Index] := NIL; NumArray[Index] := 0; END; END; {PROCEDURE Distribute} RUN(Distribute); n;A ey,1@ ?{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE Distribute; VAR ObjHandle : Handle; a,d,m,f,g,h,i,j,k : Real; t : INTEGER; NumOfObjs:INTEGER; HandleArray:array[1..100] of Handle; NumArray:array[1..100] of INTEGER; Index:INTEGER; RecHandle:Handle; SymAngle:Real; RotateObjects:boolean; MissingNumber:boolean; {-------------------------------------------------------} PROCEDURE FillArray; VAR unitNum:Real; unitStr:string; BEGIN MissingNumber := False; NumOfObjs := 0; ObjHandle := FSActLayer; WHILE ObjHandle <> NIL DO BEGIN IF GetType(ObjHandle) = 15 THEN BEGIN RecHandle := GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN NumOfObjs := NumOfObjs + 1; unitStr := EvalStr(ObjHandle, ('Lights'.'Unit #')); IF unitStr = '' THEN MissingNumber := True ELSE BEGIN unitNum := Str2Num(unitStr); HandleArray[NumOfObjs] := ObjHandle; NumArray[NumOfObjs] := unitNum; END; END; {IF (RecHandle<>NIL)} END; {IF GetType(ObjHandle) = 15 } IF MissingNumber THEN ObjHandle := NIL ELSE ObjHandle := NextSObj(ObjHandle); END; {WHILE ObjHandle <> NIL} END; {FillArray} {-------------------------------------------------------} PROCEDURE SortArray; VAR index1,index2:INTEGER; num1,num2:INTEGER; objectHolder:Handle; numHolder:INTEGER; BEGIN index1 := 1; FOR index1 := 1 TO NumOfObjs - 1 DO BEGIN FOR index2 := index1 +1 TO NumOfObjs DO BEGIN IF NumArray[index1] > NumArray[index2] THEN BEGIN objectHolder := HandleArray[index2]; numHolder := NumArray[index2]; HandleArray[index2] := HandleArray[index1]; NumArray[index2] := NumArray[index1]; HandleArray[index1] := objectHolder; NumArray[index1] := numHolder; END; {IF NumArray[index1] < NumArray[index2]} END; {FOR index2} END; {FOR index1} END; {SortArray} {-------------------------------------------------------} BEGIN IF (NumSObj(ActLayer) > 1) THEN BEGIN RotateObjects := YNDialog('Rotate Symbols Perpendicular to the line?'); FOR Index := 1 TO 100 DO BEGIN HandleArray[Index] := NIL; NumArray[Index] := 0; END; AngleVar; ObjHandle := FSActLayer; FillArray; IF (NOT MissingNumber) THEN BEGIN Message('Draw distribution line'); GetLine(m,f,g,h); ClrMessage; SortArray; IF m = g THEN a := 90 ELSE a := ArcTan((h - f)/(g - m)) * 180/pi; d := Distance(m,f,g,h)/(NumSObj(ActLayer)); IF ((a = 90) & (h < f)) OR (g < m) THEN d := -d; MoveTo(m,f); MoveTo(d/2,#a); PenLoc(m,f); FOR Index := 1 TO NumOfObjs DO BEGIN ObjHandle := HandleArray[Index]; GetSymLoc(ObjHandle,i,j); SymAngle := GetSymRot(ObjHandle); HMove(ObjHandle,m - i,f - j); MoveTo(d,#a); DSelectAll; IF RotateObjects THEN BEGIN SetSelect(ObjHandle); Rotate(#a-SymAngle); END; PenLoc(m,f); END; {FOR Index := 1 TO NumOfObjs} Redraw; END {IF (NOT MissingNumber)} ELSE BEGIN Sysbeep; AlrtDialog('At least one symbol is not numbered.'); END; END ELSE BEGIN Sysbeep; AlrtDialog('Not enough objects are selected.'); END; FOR Index := 1 TO 100 DO BEGIN HandleArray[Index] := NIL; NumArray[Index] := 0; END; END; {PROCEDURE Distribute} RUN(Distribute); Sy,1@-{Macros Developed by Sam Jones} { Copyright June 1993} {in consultation with Stan Pressner} {See Credits} PROCEDURE Distribute; LABEL 9; CONST kFixtureSpacing = 9; VAR ObjHandle : Handle; a,d,m,f,g,h,i,j,k : Real; DlgDist:Real; NumOfObjs:INTEGER; HandleArray:array[1..100] of Handle; NumArray:array[1..100] of INTEGER; Index:INTEGER; RecHandle:Handle; SymAngle:Real; RotateObjects:boolean; MissingNumber:boolean; WSHan:Handle; {-------------------------------------------------------} PROCEDURE FillArray; VAR unitNum:Real; unitStr:string; BEGIN MissingNumber := False; NumOfObjs := 0; ObjHandle := FSActLayer; WHILE ObjHandle <> NIL DO BEGIN IF GetType(ObjHandle) = 15 THEN BEGIN RecHandle := GetRecord(ObjHandle,1); IF (RecHandle<>NIL) THEN BEGIN NumOfObjs := NumOfObjs + 1; unitStr := EvalStr(ObjHandle, ('Lights'.'Unit #')); IF unitStr = '' THEN MissingNumber := True ELSE BEGIN unitNum := Str2Num(unitStr); HandleArray[NumOfObjs] := ObjHandle; NumArray[NumOfObjs] := unitNum; END; END; {IF (RecHandle<>NIL)} END; {IF GetType(ObjHandle) = 15 } IF MissingNumber THEN ObjHandle := NIL ELSE ObjHandle := NextSObj(ObjHandle); END; {WHILE ObjHandle <> NIL} END; {FillArray} {-------------------------------------------------------} PROCEDURE SortArray; VAR index1,index2:INTEGER; num1,num2:INTEGER; objectHolder:Handle; numHolder:INTEGER; BEGIN index1 := 1; FOR index1 := 1 TO NumOfObjs - 1 DO BEGIN FOR index2 := index1 +1 TO NumOfObjs DO BEGIN IF NumArray[index1] > NumArray[index2] THEN BEGIN objectHolder := HandleArray[index2]; numHolder := NumArray[index2]; HandleArray[index2] := HandleArray[index1]; NumArray[index2] := NumArray[index1]; HandleArray[index1] := objectHolder; NumArray[index1] := numHolder; END; {IF NumArray[index1] < NumArray[index2]} END; {FOR index2} END; {FOR index1} END; {SortArray} {-------------------------------------------------------} BEGIN IF (NumSObj(ActLayer) > 1) THEN BEGIN WSHan := GetObject('AutoPlot Preferences'); IF WSHan = NIL THEN BEGIN AlrtDialog('No AutoPlot Preferences worksheet found. MACRO ABORTED. Run Make Prefs macro'); GOTO 9; END; IF (CellHasNum(WSHan,kFixtureSpacing,2)) THEN DlgDist := GetCellNUM(WSHan,kFixtureSpacing,2); RotateObjects := YNDialog('Rotate Symbols Perpendicular to the line?'); FOR Index := 1 TO 100 DO BEGIN HandleArray[Index] := NIL; NumArray[Index] := 0; END; FillArray; IF (NOT MissingNumber) THEN BEGIN SortArray; d := RealDialog('Spacing Distance', Num2Str(0,DlgDist)); IF DidCancel THEN GOTO 9; SelectSS(WSHan); LoadCell(kFixtureSpacing,2,Num2Str(0,d)); AngleVar; ObjHandle := FSActLayer; Message('Draw distribution line'); GetLine(m,f,g,h); ClrMessage; IF m = g THEN a := 90 ELSE a := ArcTan((h - f)/(g - m)) * 180/pi; IF ((a = 90) & (h < f)) OR (g < m) THEN d := -d; MoveTo(m,f); PenLoc(m,f); FOR Index := 1 TO NumOfObjs DO BEGIN ObjHandle := HandleArray[Index]; GetSymLoc(ObjHandle,i,j); SymAngle := GetSymRot(ObjHandle); HMove(ObjHandle,m - i,f - j); MoveTo(d,#a); DSelectAll; IF RotateObjects THEN BEGIN SetSelect(ObjHandle); Rotate(#a-SymAngle); END; PenLoc(m,f); END; {FOR Index := 1 TO NumOfObjs} CloseSS(WSHan); DSelectAll; Redraw; END {IF (NOT MissingNumber)} ELSE BEGIN Sysbeep; AlrtDialog('At least one symbol is not numbered.'); END; END ELSE BEGIN Sysbeep; AlrtDialog('Not enough objects are selected.'); END; 9: FOR Index := 1 TO 100 DO BEGIN HandleArray[Index] := NIL; NumArray[Index] := 0; END; END; {PROCEDURE Distribute} RUN(Distribute); y,1@PROCEDURE ResetOrigin; var X,Y:REAL; BEGIN GetOrigin(X,Y); SetOrigin(0-X,0-Y); END; {PROCEDURE ResetOrigin} RUN(ResetOrigin); $"Ty,3 @M<M,``'`'`y,'` 1 @}{Developed by Julian Carr 1998 with modifications by Marc Durand Use entirely at your own risk! Make a temporary duplicate of the original object. Run the command. Click once on the original object with the records. Then click once on the object you want to transfer them to. If necessary, use Edit Group on your final object, to go back one step to make a copy of the original object. Exit Group, then Paste to make the temporary duplicate.} Procedure TransferRecs; VAR h1,h2,hRec:HANDLE; RName,FName,FNameStr,FieldVal:STRING; i,j,k : INTEGER; x, y:REAL; BEGIN h1:=Nil; h2:=Nil; k:=0; AlrtDialog('Click once on the source object, then once on the destination object you are transferring records to.'); ReDrawAll; Message('Click on the source object . . .'); GetPt(x,y); h1:= PickObject(x,y); Message('Click on the destination object . . .'); GetPt(x,y); h2:= PickObject(x,y); IF (h1<>Nil) & (h2<>Nil) THEN BEGIN FOR i:=1 TO NumRecords(h1) DO BEGIN hRec:=GetRecord(h1,i); RName:=GetName(hRec); SetRecord(h2,RName); FOR j:=1 TO NumFields(hRec) DO BEGIN FName:=GetFldName(hRec,j); FNameStr:=Concat('''',RName,'''','.','''',FName,''''); FieldVal:=EvalStr(h1,FNameStr); SetRField(h2,RName,FName,FieldVal); END; k:=k+1; END; END; AlrtDialog(Concat(k,' record(s) were transfered to the new object.')); ClrMessage; DSelectAll; END; RUN(TransferRecs);n;A!y,'`(1 @!{*Design Limits Target strings containing 255 characters or more are not searched. Any wrapping accomplished manually by reshaping the handles of text blocks is not retained when a string is replaced. Worksheet function replaces strings found in cells using default text formating. Does NOT search names. Also, a SELECTED ONLY check box would be nice. *} PROCEDURE ReplaceTxt; LABEL 1,2; VAR h,i,layerHandleT : HANDLE; Sr,x,y,strTooLongCount : REAL; Oldstring,Newstring,Chkstring,Wrkstring1,Wrkstring2,Nchkstring : STRING; S1,S2,S3,S4,Sn,CountStr,layerName : STRING; indx1,lenold,lennew,lenwrk1,lenchk,lenrem, f,f1,f2,f3,tn,c,r,c1,r1,ca : INTEGER; finished,cancel,te,db,ws,cs : BOOLEAN; item,x1,x2,count,counter : INTEGER; numOfNames,n1,objType : INTEGER; nameStr : STRING; PROCEDURE CenterDialog(dX1,dX2 : INTEGER; VAR x1,x2 : INTEGER); VAR scrX1,scrY1,scrX2,scrY2,w : INTEGER; BEGIN GetScreen(scrX1,scrY1,scrX2,scrY2); w := dX2 - dX1; x1 := ((scrX1 + scrX2) DIV 2) - (w DIV 2); x2 := x1 + w; END; PROCEDURE Replace(VAR Oldstring,Newstring,Chkstring,Nchkstring: STRING; VAR f,lenold,lennew,lenwrk1,count: INTEGER); LABEL 3; BEGIN f := 0; indx1 := POS(Oldstring,Chkstring); IF (LEN(Chkstring) > 254) THEN BEGIN strTooLongCount := strTooLongCount + 1; indx1 := 0; END; IF Newstring = '' THEN BEGIN WHILE indx1 <> 0 DO BEGIN DELETE (Chkstring,indx1,lenold); IF Chkstring = '' THEN BEGIN f := 1; count := count + 1; Nchkstring := ''; GOTO 3; END; indx1 := POS(Oldstring,Chkstring); f := 1; count := count + 1; END; Nchkstring := Chkstring; GOTO 3; END; WHILE indx1 <> 0 DO BEGIN f3 := 0; If f = 1 THEN BEGIN lennew := LEN(Newstring); indx1 := indx1 + lenwrk1 + lennew; END; lenchk := LEN(Chkstring); IF lenold = lenchk THEN Nchkstring := Newstring ELSE BEGIN lenwrk1 := indx1 - 1; DELETE(Chkstring,indx1,lenold); IF indx1 = 1 THEN BEGIN f3 := 1; Wrkstring2 := Chkstring; Nchkstring := CONCAT(Newstring,Wrkstring2); END ELSE BEGIN Wrkstring1 := COPY(Chkstring,1,lenwrk1); IF lenchk = indx1 + lenold -1 THEN Nchkstring := CONCAT(Wrkstring1,Newstring) ELSE BEGIN f3 := 1; lenrem := lenchk - lenold - indx1 + 1; Wrkstring2 := COPY(Chkstring,indx1,lenrem); Nchkstring := CONCAT(Wrkstring1,Newstring,Wrkstring2); END; END; END; Chkstring := Nchkstring; IF f3 = 1 THEN indx1 := POS(Oldstring,Wrkstring2) ELSE indx1 := 0; f := 1; count := count + 1; END; 3:END; PROCEDURE SearchRecords; VAR myS,recordName,fieldName,DBRef:STRING; layerHandleR,handleToRecord,objectHandle:HANDLE; myR:REAL; i,j,k,l:INTEGER; BEGIN layerHandleR:= FLayer; WHILE (layerHandleR<>NIL) DO BEGIN objectHandle:= FInLayer(layerHandleR); WHILE (objectHandle<>NIL) DO BEGIN i := NumRecords(objectHandle); IF (i>0) THEN BEGIN FOR j := 1 to i DO BEGIN handleToRecord := GetRecord(objectHandle,j); recordName:= GetName(handleToRecord); k := NumFields(handleToRecord); FOR l := 1 to k DO BEGIN myS := GetFldName(handleToRecord,l); fieldName:= myS; myR := GetFldType(handleToRecord,l); myS := Num2Str(0,myR); DBRef:=CONCAT('(''',recordName,'''.''',fieldName,''')'); myS:= EvalStr(ObjectHandle,DBRef); Chkstring := myS; f := 0; Replace(Oldstring,Newstring,Chkstring,Nchkstring,f,lenold,lennew,lenwrk1,count); IF f = 1 THEN BEGIN IF Nchkstring = '' THEN SetRField(ObjectHandle,recordName,fieldName,'0') ELSE SetRField(ObjectHandle,recordName,fieldName,Nchkstring); END; END; {of FOR l := 1 to k} END; {of FOR j := 1 to i} END; {of IF Statement} objectHandle:= NextObj(objectHandle); END; {of Objects in Layer LOOP} layerHandleR:= NextLayer(layerHandleR); END; {of Layer LOOP} END; {of SearchRecords} BEGIN PUSHATTRS; CenterDialog(0,450,x1,x2); BeginDialog(1,1,x1,40,x2,262); AddButton('Change All',1,1,316,190,398,210); AddButton('Cancel',2,1,225,190,285,210); AddField('_______________________',3,1,140,16,300,34); AddField('Find and Replace Dialog',4,1,140,10,300,24); AddField('Search where:',5,1,30,50,129,67); AddField('Replace with:',6,1,209,114,303,132); AddField('Find what:',7,1,209,50,282,67); AddField('Search String...',8,2,211,74,406,90); AddField('Replace String...',9,2,211,140,406,155); AddButton('Text Objects',10,2,30,84,137,104); AddButton('Record Fields',11,2,30,112,166,132); AddButton('Worksheets',12,2,30,140,141,160); EndDialog; GetDialog(1); SelField(8); finished := FALSE; cancel:= FALSE; REPEAT DialogEvent(item); IF item > 2 THEN BEGIN IF item > 9 THEN SetItem(item,NOT(ITEMSEL(item))); END ELSE BEGIN IF item = 2 THEN BEGIN finished := TRUE; cancel := TRUE; GOTO 1; END; IF item = 1 THEN BEGIN IF NOT(ITEMSEL(10) OR ITEMSEL(11) OR ITEMSEL(12)) THEN BEGIN SYSBEEP; FOR counter := 1 TO 4 DO BEGIN SetItem(10,NOT(ITEMSEL(10))); SetItem(11,NOT(ITEMSEL(11))); SetItem(12,NOT(ITEMSEL(12))); WAIT(1); END; GOTO 1; END; IF Getfield(8) = 'Search String...' THEN BEGIN SYSBEEP; SelField(8); GOTO 1; END; IF Getfield(9) = 'Replace String...' THEN BEGIN SYSBEEP; SelField(9); GOTO 1; END ELSE finished := TRUE; END; 1:END; UNTIL finished; Oldstring:=Getfield(8); Newstring:=Getfield(9); te:= ITEMSEL(10); db:= ITEMSEL(11); ws:= ITEMSEL(12); CLRDIALOG; IF cancel THEN GOTO 2; SETCURSOR(WATCHC); strTooLongCount:= 0; lenold := LEN(Oldstring); count := 0; IF te THEN BEGIN DSelectObj(ALL); SELECTOBJ(T=Text); layerHandleT:= FLayer; WHILE (layerHandleT <> NIL) DO BEGIN layerName:= GetLName(layerHandleT); Layer(layerName); h := FSActLayer; WHILE h <> NIL DO BEGIN f := 0; Chkstring := GETTEXT(h); Replace(Oldstring,Newstring,Chkstring,Nchkstring,f,lenold,lennew,lenwrk1,count); IF f = 1 THEN BEGIN IF Nchkstring = '' THEN BEGIN i := h; h := NEXTSOBJ(h); DSELECTOBJ(T=Text); SETSELECT(i); DELETEOBJS; SELECTOBJ(T=Text); END ELSE BEGIN SETTEXT(h,Nchkstring); h := NEXTSOBJ(h); END; END ELSE h := NEXTSOBJ(h); END; layerHandleT:= NextLayer(layerHandleT); END; END; DSelectObj(T=Text);; IF db THEN SearchRecords; IF ws THEN BEGIN CENTERDIALOG(0,320,x1,x2); BEGINDIALOG(2,1,x1,190,x2,318); ADDBUTTON('Use Default',1,1,197,81,292,104); ADDBUTTON('Cancel',2,1,118,82,182,105); ADDFIELD('Default formatting is used when strings',3,1,18,21,302,39); ADDFIELD('are replaced in worksheet cells.',4,1,18,44,246,62); ENDDIALOG; GetDialog(2); finished := FALSE; cancel:= FALSE; REPEAT DialogEvent(item); IF item = 2 THEN BEGIN finished := TRUE; cancel := TRUE; END; IF item = 1 THEN finished := TRUE; UNTIL finished; CLRDIALOG; IF cancel THEN GOTO 2; f2 := 0; numOfNames:= NameNum; FOR n1:= 1 TO numOfNames DO BEGIN nameStr:= NameList(n1); h:= GetObject(nameStr); objType:= GetType(h); IF (objType = 18) THEN BEGIN f1 := 0; { Need a WSheetIsOpen Function !!!!!!!!!!!!!} f2 := 1; SelectSS(h); SprdSize(h,r,c); FOR r1 := 1 TO r DO BEGIN FOR c1 := 1 TO c DO BEGIN cs := CellHasStr(h,r1,c1); f := 0; IF cs THEN BEGIN Chkstring := GetCellStr(h,r1,c1); Replace(Oldstring,Newstring,Chkstring,Nchkstring,f,lenold,lennew,lenwrk1,count); IF f = 1 THEN BEGIN f1 := 1; ca := GetCAlign(h,r1,c1); SprdAlign(ca); { Need a GetCellTxtFormat Function !!!!!!!!!!!!!} { Need a SetCellTxtFormat Function !!!!!!!!!!!!!} LoadCell(r1,c1,Nchkstring); END; END; END; END; IF f1 = 1 THEN DoMenuText('WSRecalculate'); END; END; IF f2 = 1 THEN CloseSS(h); END; DSELECTALL; IF strTooLongCount > 0 THEN BEGIN IF strTooLongCount < 2 THEN ALRTDIALOG('One block of text was skipped because its length was greater than 255 characters.') ELSE BEGIN s1:=(Num2Str(0,strTooLongCount)); s2:= CONCAT(s1,' blocks of text were skipped because their lengths were each greater than 255 characters.'); ALRTDIALOG(s2); END; END; IF count = 0 THEN BEGIN SYSBEEP; ALRTDIALOG('String not found.'); GOTO 2; END; CountStr := NUM2STR(0,count); CountStr := CONCAT(CountStr,' OCCURRENCE(S) CHANGED.'); SYSBEEP; ALRTDIALOG(countstr); 2:CLRMESSAGE; POPATTRS; END; RUN(ReplaceTxt); ny,;Any,;An;A/y,'`81 @ Procedure SuperNudge; { @1995, Graphsoft, Inc. Developed by Tom Urie This procedure allows the user to nudge an object by way of a dialog box. } LABEL 1,5,99; VAR A,V,x,y,x1,y1 : REAL; MoveDir : INTEGER; ObjH1 : HANDLE; Finished : BOOLEAN; Procedure CircleDialog; { This procedure creates the dialog box. } VAR Width,x1,y1,x2,y2,px1,px2,px3,px4,py1,py2 : INTEGER; Procedure AlignScr(Width:INTEGER; VAR x1,x2,y:INTEGER); VAR scrx1,scry1,scrx2,scry2:INTEGER; BEGIN GetScreen(scrx1,scry1,scrx2,scry2); {x1:=((scrx1+scrx2) div 2)-(Width div 2);} x1:=10; x2:=x1+Width; y:= scry1 + 50; END; Procedure MakeDialog; { This procedure defines the dialog box. } CONST scnh = 240; scnw = 190; bw = 7; cw1 = 3; cw2 = 20; cw3 = -2; cw4 = 10; ch1 = 15; ch2 = 30; bxf = 35; byf = 30; VAR n,j,k,y,y1 : INTEGER; bx,by : ARRAY[1..3] OF INTEGER; BEGIN AlignScr(scnw,x1,x2,y); y1:=y; y2:=y1 + scnh; px1:=(scnw DIV 2) - 30; px2:=(scnw DIV 2) + 30; py1:=scnh-40; py2:=scnh-20; BeginDialog(1,1,x1,y1,x2,y2); AddButton('Done',1,1,px1,py1,px2,py2); AddField('___________________________',2,1,20,18,180,33); AddField('SuperNudge',3,1,20,10,165,25); AddField('Increment:',4,1,20,45,100,60); AddField('',5,2,110,45,170,60); AddField('Angle:',6,1,20,70,100,85); AddField('',7,2,110,70,170,85); bx[1]:=(scnw div 2) - bxf; bx[2]:=(scnw div 2); bx[3]:=(scnw div 2) + bxf; by[1]:=100; by[2]:=by[1] + byf; by[3]:=by[2] + byf; n:=7; FOR j:=1 TO 3 DO BEGIN FOR k:= 1 TO 3 DO BEGIN n:=n+1; AddButton('',n,2,bx[k] - bw,by[j],bx[k] + bw,by[j]+15); END; END; FOR j:=1 TO 3 DO BEGIN FOR k:= 1 TO 3 DO BEGIN n:=n+2; IF k <> 3 THEN AddField('--',n,1,bx[k] + bw + cw1,by[j],bx[k] + bw + cw2,by[j] + 15); IF j <> 3 THEN AddField('|',n+1,1,bx[k] + cw3,by[j] + ch1,bx[k] + cw4,by[j] + ch2); END; END; EndDialog; END; BEGIN MakeDialog; END; Procedure GetInfo; { This procedure displays the dialog box and retrieves the information. } LABEL 10,20,30; VAR Item : INTEGER; Done : BOOLEAN; BEGIN Done:=FALSE; Finished:=FALSE; GetDialog(1); SetField(5,Num2Str(4,V)); SetField(7,Num2StrF(A)); SelField(5); SetItem(12,TRUE); REPEAT DialogEvent(Item); IF Item = 1 THEN BEGIN Done:=TRUE; Finished:=TRUE; END; IF (Item > 7) AND (Item < 17) THEN BEGIN MoveDir:=Item-7; Done:=TRUE; END; UNTIL Done; V:=Str2Num(GetField(5)); A:=Str2Num(GetField(7)); END; { Main Program. } BEGIN ObjH1:=FSActLayer; IF ObjH1 = NIL THEN GOTO 5; { Display dialog box. } CircleDialog; SetCursor(ArrowC); { Get information from the dialog box. } 1:GetInfo; SetCursor(ArrowC); IF Finished THEN GOTO 99; x:=Abs(V); y:=Abs(V); x1:=Abs(V*Cos(Deg2Rad(A))); y1:=Abs(V*Sin(Deg2Rad(A))); IF MoveDir = 1 THEN BEGIN x1:=-Abs(x1); y1:=Abs(y1); HMove(ObjH1,x1,y1); END ELSE IF MoveDir = 2 THEN BEGIN x:=0; y:=Abs(y); HMove(ObjH1,x,y); END ELSE IF MoveDir = 3 THEN BEGIN x1:=Abs(x1); y1:=Abs(y1); HMove(ObjH1,x1,y1); END ELSE IF MoveDir = 4 THEN BEGIN x:=-Abs(x); y:=0; HMove(ObjH1,x,y); END ELSE IF MoveDir = 5 THEN BEGIN Sysbeep; END ELSE IF MoveDir = 6 THEN BEGIN x:=Abs(x); y:=0; HMove(ObjH1,x,y); END ELSE IF MoveDir = 7 THEN BEGIN x1:=-Abs(x1); y1:=-Abs(y1); HMove(ObjH1,x1,y1); END ELSE IF MoveDir = 8 THEN BEGIN x:=0; y:=-Abs(y); HMove(ObjH1,x,y); END ELSE IF MoveDir = 9 THEN BEGIN x1:=Abs(x1); y1:=-Abs(y1); HMove(ObjH1,x1,y1); END; Redraw; GOTO 1; 5:SysBeep; AlrtDialog('There are no objects selected!'); 99: ClrDialog; END; RUN(SuperNudge);ny,;An;Azy,'`<1@TProcedure ChangeData; { 1995, Graphsoft, Inc. This procedure will change any or all of the fields of the record named 'RecordName' that is attached to the selected object located on the drawing. The new values are input by the user by way of a custom dialog box. Restrictions of this procedure are that no more than 10 records can be attached to the object, and the record to be changed can have no more than 15 fields. These are arbitrary restrictions and can be modified by changing the array limits of the appropiate variables. } LABEL 5,10,20,99; VAR i,j,k,NFields,NRecords : INTEGER; ObjectH,RecordH,FObjectH,TextH : HANDLE; RecordName,Field : STRING; RName : ARRAY[1..10] OF STRING; FieldName,FieldNameD,FieldVal,NewVal : ARRAY[1..15] OF STRING; Abort : BOOLEAN; Procedure Dialog1; { This procedure creates a custom dialog box (Dialog Box #1) which asks the user for the new values of all of the fields of the record. } VAR Width,x1,y1,x2,y2,px1,px2,px3,px4,py1,py2 : INTEGER; Procedure AlignScr(Width:INTEGER; VAR x1,x2:INTEGER); VAR scrx1,scry1,scrx2,scry2:INTEGER; BEGIN GetScreen(scrx1,scry1,scrx2,scry2); x1:=((scrx1+scrx2) div 2)-(Width div 2); x2:=x1+Width; END; Procedure MakeDialog1(NFields : INTEGER); CONST y1=50; scnw=325; VAR scnh,j,h : INTEGER; BEGIN scnh:=140+25*NFields; AlignScr(scnw,x1,x2); y2:=y1+scnh; px1:=(scnw div 2) - 70; px2:=(scnw div 2) - 10; px3:=(scnw div 2) + 10; px4:=(scnw div 2) + 70; py1:=scnh-40; py2:=scnh-20; BeginDialog(1,1,x1,y1,x2,y2); AddButton('OK',1,1,px1,py1,px2,py2); AddButton('Cancel',2,1,px3,py1,px4,py2); AddField('_____________________________________',3,1,20,18,305,33); AddField('Change Record Data',4,1,20,10,250,25); AddField('Record Name:',5,1,20,40,125,55); AddField(RecordName,6,1,130,40,300,55); h:=50; j:=5; FOR i:= 1 TO NFields DO BEGIN h:=h+25; j:=j+2; AddField(FieldNameD[i],j,1,20,h,125,h+15); AddField(FieldVal[i],j+1,2,135,h,300,h+15); END; EndDialog; END; BEGIN MakeDialog1(NFields); END; Procedure Dialog2; { This procedure creates a custom dialog box (Dialog Box #2) which asks the user for the record name if more than one record is attached to the object. } VAR Width,x1,y1,x2,y2,px1,px2,px3,px4,py1,py2 : INTEGER; Procedure AlignScr(Width:INTEGER; VAR x1,x2:INTEGER); VAR scrx1,scry1,scrx2,scry2:INTEGER; BEGIN GetScreen(scrx1,scry1,scrx2,scry2); x1:=((scrx1+scrx2) div 2)-(Width div 2); x2:=x1+Width; END; Procedure MakeDialog2(NRecords : INTEGER); CONST y1=50; scnw=375; VAR scnh,j,h : INTEGER; BEGIN scnh:=100+25*NRecords; AlignScr(scnw,x1,x2); y2:=y1+scnh; px1:=(scnw div 2) - 70; px2:=(scnw div 2) - 10; px3:=(scnw div 2) + 10; px4:=(scnw div 2) + 70; py1:=scnh-40; py2:=scnh-20; BeginDialog(2,1,x1,y1,x2,y2); AddButton('OK',1,1,px1,py1,px2,py2); AddButton('Cancel',2,1,px3,py1,px4,py2); AddField('The following records are attached to the object:',3,1,20,10,355,25); h:=15; j:=3; FOR i:= 1 TO NRecords DO BEGIN h:=h+20; j:=j+1; AddButton(RName[i],j,3,40,h,325,h+15); END; h:=h+25; AddField('Select the one you want to change.',j+1,1,20,h,275,h+15); EndDialog; END; BEGIN MakeDialog2(NRecords); END; Procedure GetInfo1; { This procedure displays Dialog Box #1 and retrieves the information input by the user. } VAR Done : Boolean; i,n,Item : Integer; BEGIN Done:=FALSE; Abort:=FALSE; GetDialog(1); SelField(8); REPEAT DialogEvent(Item); IF Item=1 THEN Done:=TRUE; IF Item=2 THEN BEGIN Done:=TRUE; Abort:=TRUE; END; UNTIL Done; n:=6; FOR i:=1 TO NFields DO BEGIN n:=n+2; NewVal[i]:=GetField(n); END; ClrDialog; END; Procedure GetInfo2; { This procedure displays Dialog Box #2 and retrieves the information input by the user. } VAR Done : Boolean; Item,RFlag : Integer; Procedure SetRButton(Item : INTEGER); BEGIN IF RFlag <> Item THEN BEGIN SetItem(RFlag,FALSE); SetItem(Item,TRUE); RFlag:=Item; END; END; BEGIN Done:=FALSE; Abort:=FALSE; k:=1; RFlag:=4; GetDialog(2); SetItem(4,TRUE); REPEAT DialogEvent(Item); IF Item = 1 THEN Done:=TRUE; IF Item = 2 THEN BEGIN Done:=TRUE; Abort:=TRUE; END; IF Item > 3 THEN BEGIN SetRButton(Item); k:=Item-3; END; UNTIL Done; ClrDialog; END; BEGIN { Main program. } { Get the object handle. } ObjectH:=FSActLayer; IF ObjectH <> NIL THEN GOTO 10; Sysbeep; AlrtDialog('There are no objects selected!'); GOTO 99; { Check to see how many records are attached to the bubble. If more than one, display Dialog Box #2 and ask user which record to change. If none, display error message. } 10:NRecords:=NumRecords(ObjectH); IF NRecords = 0 THEN BEGIN Sysbeep; AlrtDialog('There are no records attached to this object!'); GOTO 99; END ELSE IF NRecords = 1 THEN BEGIN k:=1; GOTO 20; END ELSE BEGIN FOR i:=1 TO NRecords DO BEGIN RecordH:=GetRecord(ObjectH,i); RName[i]:=GetName(RecordH); END; Dialog2; 5:SysBeep; GetInfo2; IF Abort THEN GOTO 99; END; { Get the record handle and name. } 20:RecordH:=GetRecord(ObjectH,k); RecordName:=GetName(RecordH); { Assign the field names to the variable FieldName[i]. Append a colon to the field names to display in the dialog box. } NFields:=NumFields(RecordH); IF NFields > 15 THEN BEGIN Sysbeep; AlrtDialog('This procedure only works with 15 fields or less in the attached record!'); GOTO 99; END; FOR i:=1 TO NFields DO BEGIN FieldName[i]:=GetFldName(RecordH,i); FieldNameD[i]:=Concat(FieldName[i],':'); END; { Get the current value of all fields of the record. } FOR i:=1 TO NFields DO BEGIN Field:=Concat('''',RecordName,'''','.','''',FieldName[i],''''); FieldVal[i]:=EvalStr(ObjectH,Field); END; { Display Dialog Box #1 and get the new values for the fields. } Dialog1; GetInfo1; IF Abort THEN GOTO 99; { Change the fields to the new values. } FOR i:=1 TO NFields DO SetRField(ObjectH,RecordName,FieldName[i],NewVal[i]); 99:END; Run(ChangeData);ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;Ay,'`1@|Procedure CutLine; { 1995, Graphsoft, Inc. Developed by Tom Urie This procedure creates a cut, or section, line and applies the section name. Up to 10 segments of the line are allowed. } LABEL 5,20,30,99; CONST LeaderLgth=0.375; {Length of leader} ArrowLgth=0.1875; {Size of arrowhead} Alpha=15; {Angle of arrowhead} TxtCenter=0.1875; {Used to place text above arrowhead} TxtOffset=0.125; {Used to center text on arrowhead} TxtSize=14; {Text point size} VAR xs,ys,xt,yt,LScale,L1,L2,L3,L4,L5 : REAL; x,y : ARRAY[1..10] OF REAL; Theta : ARRAY[1..2] OF REAL; i,j,k : INTEGER; Section : STRING; Abort : BOOLEAN; LayerH : HANDLE; UPI,SF : REAL; Fmt : INTEGER; UM,UM2 : STRING; UName,DA : LONGINT; Procedure CutLineDialog; VAR Width,x1,y1,x2,y2,px1,px2,px3,px4,py1,py2 : INTEGER; Procedure AlignScr(Width:INTEGER; VAR x1,x2:INTEGER); VAR scrx1,scry1,scrx2,scry2:INTEGER; BEGIN GetScreen(scrx1,scry1,scrx2,scry2); x1:=((scrx1+scrx2) div 2)-(Width div 2); x2:=x1+Width; END; Procedure MakeDialog; CONST y1=100; scnh=150; scnw=240; BEGIN AlignScr(scnw,x1,x2); y2:=y1+scnh; px3:=(scnw div 2) - 70; px4:=(scnw div 2) - 10; px1:=(scnw div 2) + 10; px2:=(scnw div 2) + 70; py1:=scnh-40; py2:=scnh-20; BeginDialog(1,1,x1,y1,x2,y2); AddButton('OK',1,1,px1,py1,px2,py2); AddButton('Cancel',2,1,px3,py1,px4,py2); AddField('_____________________________',3,1,20,18,220,33); AddField('Cut Lines',4,1,20,10,165,25); AddField('Type in section name:',5,1,20,45,175,60); AddField('A',6,2,185,45,210,60); EndDialog; END; BEGIN MakeDialog; END; Procedure GetInfo; VAR Done:Boolean; Item:Integer; BEGIN Done:=FALSE; Abort:=FALSE; GetDialog(1); SelField(6); REPEAT DialogEvent(Item); IF Item=1 THEN Done:=TRUE; IF Item=2 THEN BEGIN Done:=TRUE; Abort:=TRUE; END; UNTIL Done; Section:=GetField(6); ClrDialog; END; { Main Program } BEGIN CutLineDialog; SetCursor(ArrowC); GetInfo; IF Abort THEN GOTO 99; { Set attributes. } PushAttrs; TextSize(TxtSize); TextFace([Italic]); TextJust(2); { Get units per inch and layer scale. } GetUnits(UName,DA,Fmt,UPI,UM,UM2); LayerH:=ActLayer; LScale:=GetLScale(LayerH); { Adjust leader and arrowhead size for units and scale. } L1:=LeaderLgth*LScale*UPI; L2:=ArrowLgth*LScale*UPI/Cos(Deg2Rad(Alpha)); L3:=2*L2*Sin(Deg2Rad(Alpha)); L4:=TxtCenter*LScale*UPI; L5:=TxtOffset*LScale*UPI; AngleVar; Absolute; { Get path for cut line and draw lines } DSelectAll; GetLine(x[1],y[1],x[2],y[2]); MoveTo(x[1],y[1]); LineTo(x[2],y[2]); Redraw; j:=2; FOR i:=3 TO 10 DO BEGIN GetPtL(x[i-1],y[i-1],x[i],y[i]); IF (x[i-1]=x[i]) AND (y[i-1]=y[i]) THEN GOTO 5; LineTo(x[i],y[i]); Redraw; j:=j+1; END; { Determine on which side of line to put arrows } 5:GetPt(xs,ys); IF x[2] <> x[1] THEN Theta[1]:=Rad2Deg(ArcTan((y[2]-y[1])/(x[2]-x[1]))) ELSE Theta[1]:=90; IF (x[j]-x[j-1]) <> 0 THEN Theta[2]:=Rad2Deg(ArcTan((y[j]-y[j-1])/(x[j]-x[j-1]))) ELSE Theta[2]:=90; yt:=(ys-y[1])*Cos(Deg2Rad(Theta[1])) + (x[1]-xs)*Sin(Deg2Rad(Theta[1])); IF yt < 0 THEN BEGIN Theta[1]:=180+Theta[1]; Theta[2]:=180+Theta[2]; END; PenPat(2); { Draw extension lines and arrowheads } k:=1; FOR i:=1 TO 2 DO BEGIN Absolute; MoveTo(x[k],y[k]); Relative; Line(L1,#(Theta[i]+90)); Move(L3/2,#(Theta[i]+180)); FillPat(2); ClosePoly; Poly(0,0,L2,#(90-Alpha+Theta[i]),L2,#-(90-Alpha-Theta[i])); { Place text } xt:=x[k]-(L1+L2*Cos(Deg2Rad(Alpha))+L4)*Sin(Deg2Rad(Theta[i])); yt:=y[k]+(L1+L2*Cos(Deg2Rad(Alpha))+L4)*Cos(Deg2Rad(Theta[i]))+L5; Absolute; TextOrigin(xt,yt); FillPat(1); BeginText; Section EndText; k:=j; END; Group; PopAttrs; 99:END; Run(CutLine);ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;A y,'`1@ Procedure BreakLine; { 1995, Graphsoft, Inc. Developed by Tom Urie This procedure creates a break line. } LABEL 99; CONST A1C=0.25; {Length of zig-zag for type #1} f=0.25; {Ratio of zig-zag to length of line for type #2} Alpha=15; {Angle of zig-zag relative to line} LDivC=1.5; {Used to determine the number of zig-zags for type #3} VAR A,A1,x1,y1,x2,y2,xt,yt,Theta,Theta2,L,L1,LDiv,LScale : REAL; i,NDiv,Type : INTEGER; Abort : BOOLEAN; LayerH : HANDLE; UPI,SF : REAL; Fmt : INTEGER; UM,UM2 : STRING; UName,DA : LONGINT; Procedure Dialog; VAR Width,x1,y1,x2,y2,px1,px2,px3,px4,py1,py2 : INTEGER; Procedure AlignScr(Width:INTEGER; VAR x1,x2:INTEGER); VAR scrx1,scry1,scrx2,scry2:INTEGER; BEGIN GetScreen(scrx1,scry1,scrx2,scry2); x1:=((scrx1+scrx2) div 2)-(Width div 2); x2:=x1+Width; END; Procedure MakeDialog; CONST y1=100; scnh=220; scnw=230; BEGIN AlignScr(scnw,x1,x2); y2:=y1+scnh; px3:=(scnw div 2) - 70; px4:=(scnw div 2) - 10; px1:=(scnw div 2) + 10; px2:=(scnw div 2) + 70; py1:=scnh-40; py2:=scnh-20; BeginDialog(1,1,x1,y1,x2,y2); AddButton('OK',1,1,px1,py1,px2,py2); AddButton('Cancel',2,1,px3,py1,px4,py2); AddField('_____________________________',3,1,20,18,210,33); AddField('Break Line',4,1,20,10,165,25); AddField('Type:',5,1,20,40,185,55); AddButton('Single - fixed size',6,3,20,65,160,80); AddButton('Single - proportional',7,3,20,90,175,105); AddButton('Multiple - fixed size',8,3,20,115,173,130); EndDialog; END; BEGIN MakeDialog; END; Procedure GetInfo; VAR Item,RFlag1 : INTEGER; Done : BOOLEAN; BEGIN Done:=FALSE; Abort:=FALSE; Type:=1; RFlag1:=6; GetDialog(1); SetItem(RFlag1,TRUE); REPEAT DialogEvent(Item); IF Item=1 THEN Done:=TRUE; IF Item=2 THEN BEGIN Done:=TRUE; Abort:=TRUE; END; IF (Item > 5) AND (Item < 9) THEN BEGIN SetItem(RFlag1,FALSE); SetItem(Item,TRUE); RFlag1:=Item; Type:=Item-5; END; UNTIL Done; ClrDialog; END; { Main Program } BEGIN DselectAll; AngleVar; Dialog; SetCursor(ArrowC); GetInfo; IF Abort THEN GOTO 99; { Get units per inch and layer scale } GetUnits(UName,DA,Fmt,UPI,UM,UM2); LayerH:=ActLayer; LScale:=GetLScale(LayerH); { Adjust constants for units and scale } A1:=A1C*LScale*UPI; LDiv:=LDivC*LScale*UPI; { Get the end points of the line and determine length and angle } GetLine(x1,y1,x2,y2); IF (x1=x2) AND (y1=y2) THEN BEGIN Sysbeep; GOTO 99; END; L:=Sqrt((y2-y1)^2 + (x2-x1)^2); IF x2 <> x1 THEN Theta:=Rad2Deg(ArcTan((y2-y1)/(x2-x1))) ELSE IF y2 > y1 THEN Theta:=90 ELSE Theta:=-90; IF x2 < x1 THEN BEGIN xt:=x1; yt:=y1; x1:=x2; y1:=y2; x2:=xt; y2:=yt; END; IF Type=2 THEN A:=f*L ELSE A:=A1; IF Type=3 THEN NDiv:=L/LDiv ELSE NDiv:=2; L1:=(L-2*(NDiv-1)*A*Tan(Deg2Rad(Alpha)))/NDiv; MoveTo(x1,y1); Relative; FOR i:=1 TO NDiv-1 DO BEGIN Line(L1,#Theta); Line(A,#(Theta-90)); Line(2*A/Cos(Deg2Rad(Alpha)), #(90+Theta-Alpha)); Line(A,#(Theta-90)); END; Line(L1,#Theta); Group; 99:END; Run(BreakLine);ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;Ay,'`1@PROCEDURE Distribute; VAR o : Handle; a,d,m,f,g,h,i,j,k : Real; t : INTEGER; {***************************************} {* Procedure Distribute evenly distributes all selected *} {* objects on the active layer along a line provided by the *} {* user. The original code by Dave Rock has been modified *} {* to space the first and last objects one half the *} {* spacing interval from the ends within the provided line.*} {***************************************} BEGIN IF (NumSObj(ActLayer) > 1) THEN BEGIN AngleVar; o := FSActLayer; Message('Draw distribution line'); GetLine(m,f,g,h); ClrMessage; IF m = g THEN a := 90 ELSE a := ArcTan((h - f)/(g - m)) * 180/pi; d := Distance(m,f,g,h)/NumSObj(ActLayer); IF ((a = 90) & (h < f)) OR (g < m) THEN d := -d; MoveTo(m,f); MoveTo(d/2,#a); PenLoc(m,f); WHILE o <> NIL DO BEGIN t := GetType(o); IF t < 24 THEN HCenter(o,i,j) ELSE Get3DCntr(o,i,j,k); HMove(o,m - i,f - j); o := NextSObj(o); MoveTo(d,#a); PenLoc(m,f); END; Redraw; END ELSE BEGIN Sysbeep; AlrtDialog('No objects are selected.'); END; END; RUN(Distribute); ny,;Any,;An;Ay,'`1@u{Developed by Julian Carr - 1997 Use the Get Font ID No. command to obtain the ID number of the new font, then select a sample text block of the old font, double click on Change Font and enter the new font ID number. All text blocks of the old font in the entire drawing will then be changed to the new font (with the exception of text in symbols).} Procedure ChangeFont; VAR h2 : HANDLE; FontOld,FontNew : INTEGER; Procedure FEO(h1 : HANDLE); BEGIN IF GetFont(h1)=FontOld THEN SetTextFont(h1,0,Len(GetText(h1)),FontNew); END; BEGIN h2:=FSActLayer; IF h2<>NIL THEN BEGIN FontOld:=GetFont(h2); FontNew:=IntDialog('New font ID number :',Num2Str(0,FontOld)); ForEachObject(FEO,(T=Text)); END ELSE AlrtDialog('Please select a sample text block.'); IF FndError THEN AlrtDialog('Some text blocks exceeded 255 characters and were not fully converted.'); END; RUN(ChangeFont);n;Aqy,1@K{Developed by Julian Carr - 1997 If you find that the Move Page tool lacks precision, particularly for small moves, try these. Move Drawing allows you to move the whole drawing in relation to the page outline by either drawing a line or by entering polar or cartesian coordinates. By default, it brings up the Move... dialogue, however if you press the spacebar while double clicking, it will move the drawing by a user defined line. Nudge Drawing prompts the user for a nudge increment (in current units at the active layer scale), then allows the entire drawing to be moved with the arrow keys. Press the spacebar to exit the command.} Procedure MoveDrawing2; VAR Dist,ActLScale,LScale : REAL; Code : INTEGER; LName : STRING; hn2layer : HANDLE; Procedure NudgeDwg(Mx,My : REAL); BEGIN hn2Layer:=FLayer; REPEAT Layer(GetLName(hn2Layer)); LScale:=GetLScale(hn2Layer); MoveObjs(Mx*LScale/ActLScale,My*LScale/ActLScale,False,True); hn2Layer:=NextLayer(hn2Layer); UNTIL hn2Layer=Nil; ReDrawAll; END; BEGIN Message('Tip : Nudging is faster with fewer layers visible.'); Dist:=Abs(DistDialog('Enter nudge increment in current units:','0')); IF NOT DidCancel THEN BEGIN Message('Use arrow keys to nudge dwg. Press spacebar to exit.'); LName:=GetLName(ActLayer); ActLScale:=GetLScale(ActLayer); REPEAT IF KeyDown(Code) THEN BEGIN IF Code=28 THEN NudgeDwg(-Dist,0) ELSE IF Code=29 THEN NudgeDwg(Dist,0) ELSE IF Code=30 THEN NudgeDwg(0,Dist) ELSE IF Code=31 THEN NudgeDwg(0,-Dist); END; UNTIL Code=32; Layer(LName); ClrMessage; END; END; RUN(MoveDrawing2);y,'` 1@{Developed by Julian Carr - 1997 If you find that the Move Page tool lacks precision, particularly for small moves, try these. Move Drawing allows you to move the whole drawing in relation to the page outline by either drawing a line or by entering polar or cartesian coordinates. By default, it brings up the Move... dialogue, however if you press the spacebar while double clicking, it will move the drawing by a user defined line. Nudge Drawing prompts the user for a nudge increment (in current units at the active layer scale), then allows the entire drawing to be moved with the arrow keys. Press the spacebar to exit the command.} Procedure MoveDrawing; VAR x1,y1,x2,y2,Mx,My,ActLScale,LScale : REAL; LName : STRING; hn2layer : HANDLE; Code : INTEGER; BEGIN DoMenuText('Top/Plan'); IF AutoKey(Code) & (Code=32) THEN BEGIN Message('Draw a line to indicate move distance and direction.'); GetLine(x1,y1,x2,y2); Mx:=x2-x1; My:=y2-y1; END ELSE BEGIN Message('Enter polar or cartesian information to move drawing.'); Locus(0,0); DoMenuText('Move'); GetLocPt(LSActLayer,Mx,My); DelObject(LSActLayer); END; hn2Layer:=FLayer; LName:=GetLName(ActLayer); ActLScale:=GetLScale(ActLayer); REPEAT Layer(GetLName(hn2Layer)); LScale:=GetLScale(hn2Layer); MoveObjs(Mx*LScale/ActLScale,My*LScale/ActLScale,False,True); hn2Layer:=NextLayer(hn2Layer); UNTIL hn2Layer=Nil; Layer(LName); ClrMessage; END; RUN(MoveDrawing);n;A-y,1@{Developed by Julian Carr - 1997 These commands make working in MiniCad easier, by giving the user instant control over object visibility, depending only on selection status. Hide Selected will hide all objects that are selected, while Hide Unselected, will hide unselected objects. To return to the previous visibility status, go to the Class menu and choose the active class (the one with a tick).} Procedure HideUnselected; Procedure FEO1(hn2Obj:HANDLE); BEGIN hn2Obj:=FIn3D(hn2Obj); REPEAT SetSelect(hn2Obj); hn2Obj:=NextObj(hn2Obj); UNTIL hn2Obj=Nil; END; Procedure FEO2(hn2Obj:HANDLE); BEGIN SetDSelect(hn2Obj); END; BEGIN ForEachObject(FEO1,(T=Wall)&(Sel=True)); Hide((Sel=False)); ForEachObject(FEO2,(Sel=True)&(T=Symbol)); END; Run(HideUnselected);y,1@{Developed by Julian Carr - 1997 These commands make working in MiniCad easier, by giving the user instant control over object visibility, depending only on selection status. Hide Selected will hide all objects that are selected, while Hide Unselected, will hide unselected objects. To return to the previous visibility status, go to the Class menu and choose the active class (the one with a tick).} Procedure HideSelected; VAR hn2Obj : HANDLE; BEGIN IF (NumSObj(ActLayer)=1)&(GetType(FSActLayer)=11) THEN BEGIN hn2Obj:=FInGroup(FSActLayer); REPEAT IF Selected(hn2Obj) THEN Hide((Sel=True)& V); hn2Obj:=NextObj(hn2Obj); UNTIL hn2Obj=Nil; END ELSE Hide((Sel=True)); END; Run(HideSelected);y,'`,1@fprocedure reset; VAR x,y:REAL; BEGIN GetOrigin(x,y); SetOrigin(-x,-y); END; run(reset);ny,;Any,;Any,;An;Ay,'`D1@{Developed by Julian Carr - 1997} Procedure ShowObjsInGroup; BEGIN IF GetPref(14) THEN SetPref(14,False) ELSE SetPref(14,True); END; RUN(ShowObjsInGroup);n;A0y,1@ Show(ALL);;y,1@Show((L='Ltg Grid'));;y,1@Hide((L='Ltg Grid'));y,'`\1@{Developed by Julian Carr 1997} Procedure ScaleDrawing; VAR h : HANDLE; Factor : REAL; BEGIN Factor:=RealDialog('WARNING! DANGER!! Rescale entire drawing? Scale:','100%'); IF NOT DidCancel THEN BEGIN h:=FLayer; REPEAT SetLScale(h,GetLScale(h)/Factor*100); Message('Rescaling layer : ',GetLName(h),'....'); h:=NextLayer(h); UNTIL h=NIL; ClrMessage; END; END; Run(ScaleDrawing);n;Ay,'`d1@Procedure FileNamer; { David K. H. Elliott dkhe@wenet.net 1997 } VAR ObjectHd : HANDLE; DocName : STRING; BEGIN DocName:=GetFName; ObjectHd:=GetObject('File Name 2'); SetText(ObjectHd,DocName); END; Run(FileNamer);ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;Aty,'`1@NProcedure Stamp; {MiniCad 6 MiniPascal Manual Example 1} {'know the code' by: David K. H. Elliott dkhe@wenet.net } VAR ObjectHd:HANDLE; DateVal:STRING; BEGIN DateVal:=Date(1,0); ObjectHd:=GetObject('Date Stamp 2'); SetText(ObjectHd,DateVal); END; Run(Stamp); {know the code... 0,0: Friday, October 17, 1997 0,1: Friday, October 17, 1997 12:04:06 PM 0,2: 12:05:57 PM 1,0: Fri, Oct 17, 1997 1,1: Fri, Oct 17, 1997 12:05:27 PM 1,2: 12:09:34 PM 2,0: 10/17/97 2,1: 10/17/97 12:18:09 PM 2,2: 12:18:33 PM } ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;Ay,'`1@PROCEDURE Test; {By: Kevin Brookes Home : 301 834 6121 (From 11/20/95)} VAR a:HANDLE; b:REAL; MStr:STRING; BEGIN a:=ActLayer; b:=GetLScale(a); IF b <> 0 Then BEGIN IF b = 192 THEN MStr:= '1/16" = 1''-0"' ELSE IF b = 96 THEN MStr:= '1/8" = 1''-0"' ELSE IF b = 48 THEN MStr:= '1/4" = 1''-0"' ELSE IF b = 32 THEN MStr:= '3/8" = 1''-0"' ELSE IF b = 24 THEN MStr:= '1/2" = 1''-0"' ELSE IF b = 16 THEN MStr:= '3/4" = 1''-0"' ELSE IF b = 12 THEN MStr:= '1" = 1''-0"' ELSE IF b = 8 THEN MStr:= '1 1/2" = 1''-0"' ELSE IF b = 4 THEN MStr:= '3" = 1''-0"' ELSE IF b = 1 THEN MStr:='Actual Size' END; MStr:=Concat('Current Scale is : ', MStr); AlrtDialog(MStr); END; RUN(Test); ny,;Any,;Any,;Any,;Any,;Any,;An;Ay,'` 1@wProcedure pt_to_pt; LABEL 99; VAR movehand:HANDLE; xm,ym:REAL; mousex,mousey:REAL; Procedure do_error(s:STRING;v:REAL); BEGIN AlrtDialog(Concat(S,' = ',Num2Str(5,V))); END; BEGIN Absolute; movehand:=FSActLayer; IF (movehand=NIL) THEN GOTO 99; GetLine(xm,ym,mousex,mousey); Hmove(movehand,mousex-xm,mousey-ym); Redraw; 99:END; Run(pt_to_pt);ny,;An;Ay,'`,1@Procedure Ref; {By: Kevin Brookes Home : 301 834 6121 (From 11/20/95) The Command reference draws the above shape with line weights and attributes the same size on any layer. It asks you for the projection name and automaticaly writes in the scale of the layer you are currently on.} CONST A=0.5625; B=0.28125; C=3; D=0.6875; E=0.1875; VAR x,y,A1,B1,C1,D1,E1,LScale:REAL; Str1,TheScale:String; LayerH:handle; BEGIN GetPt(x,y); LayerH:=ActLayer; LScale:=GetLScale(LayerH); A1:=A*LScale; B1:=B*LScale; C1:=C*LScale; D1:=D*LScale; E1:=E*LScale; PushAttrs; PenFore(0,0,56797); PenSize(20); Oval(X,Y,X+A1,Y+A1); PopAttrs; PushAttrs; PenFore(52428,13107,0); PenSize(4); MoveTo(x,y+B1); LineTo(x+A1,y+B1); PopAttrs; PushAttrs; PenFore(0,0,56797); PenSize(20); MoveTo(x+A1,y+B1); LineTo(x+C1,y+B1); PopAttrs; Str1:=StrDialog('Enter the View name', 'Front View'); FillPat(0); PenFore(203); TextFont(21); TextSize(14); TextOrigin(X+D1,Y+A1); BeginText; Str1 EndText; IF LScale = 192 THEN TheScale:= 'Scale : 1/16" = 1''0"' ELSE IF LScale = 96 THEN TheScale:= 'Scale : 1/8" = 1''0"' ELSE IF LScale = 48 THEN TheScale:= 'Scale : 1/4" = 1''0"' ELSE IF LScale = 32 THEN TheScale:= 'Scale : 3/8" = 1''0"' ELSE IF LScale = 24 THEN TheScale:= 'Scale : 1/2" = 1''0"' ELSE IF LScale = 16 THEN TheScale:= 'Scale : 3/4" = 1''0"' ELSE IF LScale = 12 THEN TheScale:= 'Scale : 1" = 1''-0"' ELSE IF LScale = 8 THEN TheScale:= 'Scale : 1 1/2"= 1''0"' ELSE IF LScale = 4 THEN TheScale:= 'Scale : 3" = 1''-0"' ELSE IF LScale = 1 THEN TheScale:='Scale : Actual Size' FillPat(0); PenFore(203); TextFont(21); TextSize(10); TextOrigin(X+D1,Y+E1); BeginText; TheScale EndText; END; RUN(Ref); ny,;Any,;An;Ay,'`@1@{Developed by Julian Carr - 1997} Procedure BlackAndWhite; BEGIN IF GetPref(10) THEN SetPref(10,False) ELSE SetPref(10,True); END; RUN(BlackAndWhite);ny,;An;A#y,'`L1@PROCEDURE Distribute; VAR o : Handle; a,d,m,f,g,h,i,j,k : Real; t : INTEGER; {***************************************} {* Procedure Distribute evenly distributes all selected *} {* objects on the active layer along a line *} {* provided by the user. *} {***************************************} BEGIN IF (NumSObj(ActLayer) > 1) THEN BEGIN AngleVar; o := FSActLayer; Message('Draw distribution line'); GetLine(m,f,g,h); ClrMessage; IF m = g THEN a := 90 ELSE a := ArcTan((h - f)/(g - m)) * 180/pi; d := Distance(m,f,g,h)/(NumSObj(ActLayer) - 1); IF ((a = 90) & (h < f)) OR (g < m) THEN d := -d; MoveTo(m,f); WHILE o <> NIL DO BEGIN t := GetType(o); IF t < 24 THEN HCenter(o,i,j) ELSE Get3DCntr(o,i,j,k); HMove(o,m - i,f - j); o := NextSObj(o); MoveTo(d,#a); PenLoc(m,f); END; Redraw; END ELSE BEGIN Sysbeep; AlrtDialog('Not enough objects are selected.'); END; END; RUN(Distribute); ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;Ay,'`t1@procedure setsudan;{AkihiroAzumaArchitects.} LABEL 1; var h1,h2,test_h:handle; t:INTEGER; x,y,x1,y1,x2,y2,x3,y3,d,a,test_x,test_y:real; procedure zahyou(zx1,zy1,zL1,za1:real;var zx2,zy2:real); begin za1:=Deg2Rad(za1); zx2:=zL1*cos(za1)+zx1; zy2:=zL1*sin(za1)+zy1; end; begin MoveTo(0,1); LineTo(1,1); test_h:=LNewObj; SetSegPt1(test_h,0,0); GetSegPt1(test_h,test_x,test_y); DelObject(test_h); Message('Click the cutting point.'); repeat GetPt(x,y); h1:=PickObject(x,y); t:=GetType(h1); if t<>2 then goto 1; DSelectAll; GetSegPt1(h1,x1,y1); if (x1=x)and(y1=y) then goto 1; GetSegPt2(h1,x2,y2); d:=Distance(x1,y1,x,y); a:=HAngle(h1); zahyou(x1,y1,d,a,x3,y3); if (x2=x3)and(y2=y3) then goto 1; SetSegPt2(h1,x3-test_x,y3-test_y); SetSelect(h1); Duplicate(0,0); h2:=FSActLayer; SetSegPt2(h2,x2-test_x,y2-test_y); SetSegPt1(h2,x3-test_x,y3-test_y); Redraw; Message('To escape, Click a blank, please.'); until t<>2; 1:ClrMessage; SetTool(2); Redraw; end; run(setsudan);ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;A y,'`D1@ Procedure DivideLine; { 1995, Graphsoft, Inc. Developed by Tom Urie This procedure divides a line into a given number of equal segments and/or places loci at the division points. } LABEL 10,99; VAR x,y,x0,y0,x1,y1,x2,y2,dx,dy:REAL; i,nSegs,TVal,Type:INTEGER; ObjectH:HANDLE; Abort,Loci,Segments,Erase : BOOLEAN; Procedure Dialog; { This procedure creates the dialog box. } VAR Width,x1,y1,x2,y2,px1,px2,px3,px4,py1,py2 : INTEGER; Procedure AlignScr(Width:INTEGER; VAR x1,x2:INTEGER); VAR scrx1,scry1,scrx2,scry2:INTEGER; BEGIN GetScreen(scrx1,scry1,scrx2,scry2); x1:=((scrx1+scrx2) div 2)-(Width div 2); x2:=x1+Width; END; Procedure MakeDialog; { This procedure defines the dialog box. } CONST y1=100; scnh=230; scnw=230; BEGIN AlignScr(scnw,x1,x2); y2:=y1+scnh; px3:=(scnw div 2) - 70; px4:=(scnw div 2) - 10; px1:=(scnw div 2) + 10; px2:=(scnw div 2) + 70; py1:=scnh-40; py2:=scnh-20; BeginDialog(1,1,x1,y1,x2,y2); AddButton('OK',1,1,px1,py1,px2,py2); AddButton('Cancel',2,1,px3,py1,px4,py2); AddField('__________________________',3,1,20,18,210,33); AddField('Divide Line',4,1,20,10,165,25); AddField('Options -',5,1,20,40,185,55); AddButton('Place loci',6,2,20,60,160,75); AddButton('Break line into segments',7,2,20,80,205,95); AddButton('Leave original line intact',8,2,20,100,205,115); AddField('Number of segments:',9,1,20,140,165,155); AddField('2',10,2,175,140,200,155); EndDialog; END; BEGIN MakeDialog; END; Procedure GetInfo; { This procedure displays the dialog box and retrieves the information. } VAR Item : INTEGER; Done : BOOLEAN; BEGIN Done:=FALSE; Abort:=FALSE; Loci:=TRUE; Segments:=TRUE; Erase:=FALSE; GetDialog(1); SetItem(6,Loci); SetItem(7,Segments); SetItem(8,NOT Erase); SelField(10); REPEAT DialogEvent(Item); IF Item=1 THEN Done:=TRUE; IF Item=2 THEN BEGIN Done:=TRUE; Abort:=TRUE; END; IF Item = 6 THEN BEGIN Loci:=NOT Loci; SetItem(Item,Loci); IF (NOT Loci) AND (NOT Segments) AND (Erase) THEN BEGIN SetItem(8,TRUE); Erase:=False; END; END; IF Item = 7 THEN BEGIN Segments:=NOT Segments; SetItem(Item,Segments); IF (NOT Segments) AND (NOT Loci) THEN BEGIN SetItem(8,TRUE); Erase:=False; END; END; IF Item = 8 THEN BEGIN Erase:=NOT Erase; SetItem(Item,NOT Erase); IF (Erase) AND (NOT Loci) THEN BEGIN SetItem(7,TRUE); Segments:=TRUE; END; END; UNTIL Done; NSegs:=Str2Num(GetField(10)); ClrDialog; END; { Main Program. } BEGIN { Check to see if a line is selected } ObjectH:=FSActLayer; IF ObjectH = NIL THEN BEGIN Sysbeep; AlrtDialog('You must select the line first!'); GOTO 99; END; TVal:=GetType(ObjectH); IF TVal <> 2 THEN BEGIN Sysbeep; AlrtDialog('The object selected is not a line!'); GOTO 99; END; { Display the dialog box } Dialog; SetCursor(ArrowC); { Get the information from the dialog box. } GetInfo; IF Abort THEN GOTO 99; { Get the end points of the line and determint the length of the segments. } GetSegPt1(ObjectH, x1,y1); GetSegPt2(ObjectH, x2,y2); dx:=(x1-x2)/nSegs; dy:=(y1-y2)/nSegs; { Delete the original line. } IF Erase THEN DelObject(ObjectH); x:=x1; y:=y1; Absolute; MoveTo(x,y); FOR i:=1 to nSegs-1 DO BEGIN x:=x1-i*dx; y:=y1-i*dy; { Draw the new line segments. } IF Segments THEN LineTo(x,y); { Place loci. } IF Loci THEN Locus(x,y); END; { Draw the last line segment. } IF Segments THEN BEGIN x:=x1-i*dx; y:=y1-i*dy; LineTo(x,y); END; 99:END; RUN(DivideLine);ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;ABy,1@DoMenuText('Flip Vertical');Dy,1@DoMenuText('Flip Horizontal');y,'`x1@jProcedure CenterOf2points; {Marc Durand Montral, Qubec} VAR x1,y1,x2,y2: REAL; BEGIN message('To get a locus between 2 point, click the first...'); GetPt(x1,y1); message('... and now click the second point.'); GetPt(x2,y2); Locus((x1+x2)/2,(y1+y2)/2); message('The locus is at the mid distance.'); wait(2); ClrMessage; END; Run(CenterOf2points); ny,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;Any,;An;Ay,'`1@iPROCEDURE layerInfo; { Petri Sakkinen 1995} { this puts layer info into a worksheet where it can be edited & with another macro 'executed'} VAR layerScale, layerCount, layerVis, objCount, counter, rowNo : INTEGER; layerName : STRING; theLayer, theWorksheet : HANDLE; BEGIN counter:=0; layerCount:=NUMLAYERS; theLayer:=FLAYER; theWorksheet:=GETOBJECT('Layer Thing'); DELOBJECT(theWorksheet); NAMEOBJECT('Layer Thing'); SPRDSHEET(0,0,layerCount+1,2); SPRDWIDTH(20); theWorksheet:=GETOBJECT('Layer Thing'); SELECTSS(theWorksheet); LOADCELL(1,1,'Layer name'); LOADCELL(1,2,'Scale'); { LOADCELL(1,3,'Visibility'); LOADCELL(1,4,'Objects');} REPEAT rowNo:=counter+2; layerName:=GETLNAME(theLayer); layerScale:=GETLSCALE(theLayer); layerVis:=GETLVIS(theLayer); objCount:=NUMOBJ(theLayer); LOADCELL(rowNo,1,layerName); LOADCELL(rowNo,2,NUM2STR(1,layerScale)); { LOADCELL(rowNo,3,NUM2STR(0,layerVis)); LOADCELL(rowNo,4,NUM2STR(0,objCount));} IF theLayer <> NIL THEN theLayer:=NEXTLAYER(theLayer); counter:=counter+1; UNTIL (counter=layerCount); END; RUN(layerInfo);ny,;Any,;Any,;Any,;Any,;An;Ay,'`1@Procedure Stamp; {MiniCad 6 MiniPascal Manual Example 1} {'know the code' by: David K. H. Elliott dkhe@wenet.net } VAR ObjectHd:HANDLE; DateVal:STRING; DocName:STRING; BEGIN DateVal:=Date(1,0); ObjectHd:=GetObject('Date Stamp 2'); SetText(ObjectHd,DateVal); DocName:=GetFName; ObjectHd:=GetObject('File Name 2'); SetText(ObjectHd,DocName); END; Run(Stamp); {know the code... 0,0: Friday, October 17, 1997 0,1: Friday, October 17, 1997 12:04:06 PM 0,2: 12:05:57 PM 1,0: Fri, Oct 17, 1997 1,1: Fri, Oct 17, 1997 12:05:27 PM 1,2: 12:09:34 PM 2,0: 10/17/97 2,1: 10/17/97 12:18:09 PM 2,2: 12:18:33 PM }n;Ay,1@{Developed by Julian Carr - 1997} Procedure OffsetDupe; BEGIN IF GetPref(1) THEN SetPref(1,False) ELSE SetPref(1,True); END; RUN(OffsetDupe);$]Ty,3@9V9V-0-0'`'`d4y,'`1@Procedure ChangeField; { 1995, Graphsoft, Inc. This procedure will change the field named 'FieldName' of the record named 'RecordName' in all instances where the record is attached to a symbol which is located in the symbol library folder named 'FolderName'. The field for all of the symbols will be changed to the same value, input by the user. } LABEL 5,10,15,18,99; VAR i,j,NFields,NSymbols,NRecords : INTEGER; FolderH,SymbolH,RecordH : HANDLE; FolderName,RecordName,FieldName,NewValue,s,s1 : STRING; Name1,Name2 : STRING; Abort : BOOLEAN; Procedure Dialog1; { This procedure creates a custom dialog box which asks the user for the symbol folder name where the symbols to be changed are located, the record name and field name to be changed, and the new value for the field. } VAR Width,x1,y1,x2,y2,px1,px2,px3,px4,py1,py2 : INTEGER; Procedure AlignScr(Width:INTEGER; VAR x1,x2:INTEGER); VAR scrx1,scry1,scrx2,scry2:INTEGER; BEGIN GetScreen(scrx1,scry1,scrx2,scry2); x1:=((scrx1+scrx2) div 2)-(Width div 2); x2:=x1+Width; END; Procedure MakeDialog1; CONST y1=100; scnh=210; scnw=325; BEGIN AlignScr(scnw,x1,x2); y2:=y1+scnh; px1:=scnw -160; px2:=scnw - 100; px3:=scnw -80; px4:=scnw -20; py1:=scnh-40; py2:=scnh-20; BeginDialog(1,1,x1,y1,x2,y2); AddButton('OK',1,1,px1,py1,px2,py2); AddButton('Cancel',2,1,px3,py1,px4,py2); AddField('_____________________________________',3,1,20,18,305,33); AddField('Change Field',4,1,20,10,250,25); AddField('Symbol folder name:',5,1,20,50,165,65); AddField('',6,2,175,50,300,65); AddField('Record name:',7,1,20,75,125,90); AddField('',8,2,175,75,300,90); AddField('Field name:',9,1,20,100,125,115); AddField('',10,2,175,100,300,115); AddField('New value:',11,1,20,125,125,140); AddField('',12,2,175,125,300,140); EndDialog; END; BEGIN MakeDialog1; END; Procedure GetInfo; { This procedure displays the dialog box and gets the information input by the user. } VAR Done : Boolean; Item : Integer; BEGIN Done:=FALSE; Abort:=FALSE; GetDialog(1); SetField(6,FolderName); SetField(8,RecordName); SetField(10,FieldName); SetField(12,NewValue); SelField(6); REPEAT DialogEvent(Item); IF Item=1 THEN Done:=TRUE; IF Item=2 THEN BEGIN Done:=TRUE; Abort:=TRUE; END; UNTIL Done; FolderName:=GetField(6); RecordName:=GetField(8); FieldName:=GetField(10); NewValue:=GetField(12); ClrDialog; END; BEGIN { Main Program. } { Display the dialog box and get the information. } Dialog1; 5:GetInfo; IF Abort THEN GOTO 99; { Check to see that the symbol folder exists. } FolderH:=GetObject(FolderName); IF FolderH = NIL THEN BEGIN Sysbeep; AlrtDialog('No such symbol folder exists!'); GOTO 5; END; { Check to see that the record exists. } RecordH:=GetObject(RecordName); IF RecordH = NIL THEN BEGIN Sysbeep; AlrtDialog('No such record exists!'); GOTO 5; END; { Check to see that the field exists. } NFields:=NumFields(RecordH); FOR i:=1 TO NFields DO BEGIN Name1:=FieldName; Name2:=GetFldName(RecordH,i); UprString(Name1); UprString(Name2); IF Name1 = Name2 THEN GOTO 10; END; Sysbeep; AlrtDialog('No such field exists!'); GOTO 5; { Get the first symbol handle in the folder. } 10:SymbolH:=FInFolder(FolderH); { Set the field to the new value. } NSymbols:=0; SetCursor(WatchC); WHILE SymbolH <> NIL DO BEGIN { Check to see that the record is attached to the symbol; if not, skip this symbol and get the next symbol in the folder. } NRecords:=NumRecords(SymbolH); FOR j:=1 TO NRecords DO BEGIN Name1:=RecordName; Name2:=GetName(GetRecord(SymbolH,j)); UprString(Name1); UprString(Name2); IF Name1 = Name2 THEN GOTO 15; END; GOTO 18; 15:NSymbols:=NSymbols+1; { Change the field to the new value. } SetRField(SymbolH,RecordName,FieldName,NewValue); { Get the next symbol handle in the folder. } 18:SymbolH:=NextObj(SymbolH); END; { Display the number of symbols changed. } IF NSymbols = 1 THEN s1:=' symbol' ELSE s1:=' symbols'; s:=Concat(Num2Str(0,NSymbols),s1,' changed.'); Sysbeep; AlrtDialog(s); 99:END; Run(ChangeField);ny,;Any,;Any,;Any,;Any,;An;Ay,'`1@iProcedure ChangeInfo; { 1995, Graphsoft, Inc. Developed by Tom Urie This procedure will change any or all of the fields of the record named 'RecordName' in all instances where the record is attached to a symbol which is located in the symbol library folder named 'FolderName'. The new values for each symbol are input by the user by way of a custom dialog box which appears for each symbol which meets the criteria. The procedure will only work with records that contain 15 fields or less. } LABEL 5,10,15,18,20,99; VAR i,j,NFields,NSymbols,NRecords : INTEGER; FolderH,SymbolH,RecordH : HANDLE; FolderName,SymbolName,RecordName,s,s1 : STRING; Name1,Name2,Field : STRING; FieldName,FieldNameD,FieldVal,NewVal : ARRAY[1..15] OF STRING; Abort : BOOLEAN; Procedure Dialog1; { This procedure creates a custom dialog box (Dialog Box #1) which asks the user for the symbol folder name where the symbols to be changed are located and the record name to be changed. } VAR Width,x1,y1,x2,y2,px1,px2,px3,px4,py1,py2 : INTEGER; Procedure AlignScr(Width:INTEGER; VAR x1,x2:INTEGER); VAR scrx1,scry1,scrx2,scry2:INTEGER; BEGIN GetScreen(scrx1,scry1,scrx2,scry2); x1:=((scrx1+scrx2) div 2)-(Width div 2); x2:=x1+Width; END; Procedure MakeDialog1; CONST y1=100; scnh=160; scnw=325; BEGIN AlignScr(scnw,x1,x2); y2:=y1+scnh; px1:=scnw -160; px2:=scnw - 100; px3:=scnw -80; px4:=scnw -20; py1:=scnh-40; py2:=scnh-20; BeginDialog(1,1,x1,y1,x2,y2); AddButton('OK',1,1,px1,py1,px2,py2); AddButton('Cancel',2,1,px3,py1,px4,py2); AddField('_____________________________________',3,1,20,18,305,33); AddField('Change Record Data',4,1,20,10,250,25); AddField('Symbol folder name:',5,1,20,50,165,65); AddField('',6,2,175,50,300,65); AddField('Record name:',7,1,20,75,125,90); AddField('',8,2,175,75,300,90); EndDialog; END; BEGIN MakeDialog1; END; Procedure Dialog2; { This procedure creates a custom dialog box (Dialog Box #2) which asks the user for the new values of all of the fields of the record. A separete box is displayed for each symbol and the current values of the fields are displayed. } VAR Width,x1,y1,x2,y2,px1,px2,px3,px4,py1,py2 : INTEGER; Procedure AlignScr(Width:INTEGER; VAR x1,x2:INTEGER); VAR scrx1,scry1,scrx2,scry2:INTEGER; BEGIN GetScreen(scrx1,scry1,scrx2,scry2); x1:=((scrx1+scrx2) div 2)-(Width div 2); x2:=x1+Width; END; Procedure MakeDialog2(NFields : INTEGER); CONST y1=50; scnw=325; VAR scnh,i,j,h : INTEGER; BEGIN scnh:=140+25*NFields; AlignScr(scnw,x1,x2); y2:=y1+scnh; px1:=scnw -160; px2:=scnw - 100; px3:=scnw -80; px4:=scnw -20; py1:=scnh-40; py2:=scnh-20; BeginDialog(2,1,x1,y1,x2,y2); AddButton('Next',1,1,px1,py1,px2,py2); AddButton('Cancel',2,1,px3,py1,px4,py2); AddField('_____________________________________',3,1,20,18,305,33); AddField('Change Record Data',4,1,20,10,250,25); AddField('Symbol Name:',5,1,20,40,125,55); AddField('',6,1,135,40,300,55); h:=50; j:=5; FOR i:= 1 TO NFields DO BEGIN h:=h+25; j:=j+2; AddField(FieldNameD[i],j,1,20,h,125,h+15); AddField('',j+1,2,135,h,300,h+15); END; EndDialog; END; BEGIN MakeDialog2(NFields); END; Procedure GetInfo1; { This procedure displays Dialog Box #1 and retrieves the information input by the user. } VAR Done : Boolean; Item : Integer; BEGIN Done:=FALSE; Abort:=FALSE; GetDialog(1); SetField(6,FolderName); SetField(8,RecordName); SelField(6); REPEAT DialogEvent(Item); IF Item=1 THEN Done:=TRUE; IF Item=2 THEN BEGIN Done:=TRUE; Abort:=TRUE; END; UNTIL Done; FolderName:=GetField(6); RecordName:=GetField(8); ClrDialog; END; Procedure GetInfo2; { This procedure displays Dialog Box #2 for each symbol and retrieves the information input by the user. } VAR Done : Boolean; i,n,Item : Integer; BEGIN Done:=FALSE; Abort:=FALSE; GetDialog(2); SetField(6,SymbolName); n:=6; FOR i:=1 TO NFields DO BEGIN n:=n+2; SetField(n,FieldVal[i]); END; SelField(8); REPEAT DialogEvent(Item); IF Item=1 THEN Done:=TRUE; IF Item=2 THEN BEGIN Done:=TRUE; Abort:=TRUE; END; UNTIL Done; n:=6; FOR i:=1 TO NFields DO BEGIN n:=n+2; NewVal[i]:=GetField(n); END; ClrDialog; END; BEGIN { Main program. } Dialog1; { Display Dialog Box #1 and get the information. } 5:GetInfo1; IF Abort THEN GOTO 99; { Check to see that the folder exists. } FolderH:=GetObject(FolderName); IF FolderH = NIL THEN BEGIN Sysbeep; AlrtDialog('No such symbol folder exists!'); GOTO 5; END; { Check to see that the record exists. } RecordH:=GetObject(RecordName); IF RecordH = NIL THEN BEGIN Sysbeep; AlrtDialog('No such record exists!'); GOTO 5; END; { Check to see that the record contains 15 fields or less. } NFields:=NumFields(RecordH); IF NFields > 15 THEN BEGIN Sysbeep; AlrtDialog('This procedure only works with 15 fields or less!'); GOTO 99; END; { Assign the field names to the variable FieldName[i]. Append a colon to the field names to display in Dialog Box #2. } FOR i:=1 TO NFields DO BEGIN FieldName[i]:=GetFldName(RecordH,i); FieldNameD[i]:=Concat(FieldName[i],':'); END; { Get the first symbol handle in the folder. } SymbolH:=FInFolder(FolderH); { Display Dialog Box #2, get the information, and change the records for each symbol. } Dialog2; NSymbols:=0; WHILE SymbolH <> NIL DO BEGIN { Check to see that the record is attached to the symbol; if not, skip this symbol and get the next symbol in the folder. } NRecords:=NumRecords(SymbolH); FOR j:=1 TO NRecords DO BEGIN Name1:=RecordName; Name2:=GetName(GetRecord(SymbolH,j)); UprString(Name1); UprString(Name2); IF Name1 = Name2 THEN GOTO 15; END; GOTO 18; { Get the symbol name. } 15:SymbolName:=GetSDName(SymbolH); { Get the current value of all fields of the record. } FOR i:=1 TO NFields DO BEGIN Field:=Concat('''',RecordName,'''','.','''',FieldName[i],''''); FieldVal[i]:=EvalStr(SymbolH,Field); END; { Display Dialog Box #2 and get the new values for the fields. } GetInfo2; IF Abort THEN GOTO 20; { Change the fields to the new values. } FOR i:=1 TO NFields DO SetRField(SymbolH,RecordName,FieldName[i],NewVal[i]); { Get the handle of the next symbol in the folder. } 18:SymbolH:=NextObj(SymbolH); NSymbols:=NSymbols+1; END; { Display the number of symbols changed. } 20:IF NSymbols = 1 THEN s1:=' symbol' ELSE s1:=' symbols'; s:=Concat(Num2Str(0,NSymbols),s1,' changed.'); Sysbeep; AlrtDialog(s); 99:END; Run(ChangeInfo);ny,;Any,;Any,;Any,;Any,;Any,;Any,;An;A Ay,'`@1@ Procedure AttachRecord; { 1995 Graphsoft, Inc. This procedure attaches the record named 'RecordName' to all of the symbols in the symbol library folder named 'FolderName'. } LABEL 5,10,99; VAR NSymbols : INTEGER; FolderH,SymbolH,RecordH : HANDLE; FolderName,RecordName,s,s1 : STRING; Abort : BOOLEAN; Procedure Dialog1; { This procedure creates a custom dialog box which asks the user for the symbol folder name and record to be attached to the symbols. } VAR Width,x1,y1,x2,y2,px1,px2,px3,px4,py1,py2 : INTEGER; Procedure AlignScr(Width:INTEGER; VAR x1,x2:INTEGER); VAR scrx1,scry1,scrx2,scry2:INTEGER; BEGIN GetScreen(scrx1,scry1,scrx2,scry2); x1:=((scrx1+scrx2) div 2)-(Width div 2); x2:=x1+Width; END; Procedure MakeDialog1; CONST y1=100; scnh=160; scnw=325; BEGIN AlignScr(scnw,x1,x2); y2:=y1+scnh; px1:=scnw -160; px2:=scnw - 100; px3:=scnw -80; px4:=scnw -20; py1:=scnh-40; py2:=scnh-20; BeginDialog(1,1,x1,y1,x2,y2); AddButton('OK',1,1,px1,py1,px2,py2); AddButton('Cancel',2,1,px3,py1,px4,py2); AddField('_____________________________________',3,1,20,18,305,33); AddField('Attach Record',4,1,20,10,250,25); AddField('Symbol folder name:',5,1,20,50,165,65); AddField('',6,2,175,50,300,65); AddField('Record name:',7,1,20,75,125,90); AddField('',8,2,175,75,300,90); EndDialog; END; BEGIN MakeDialog1; END; Procedure GetInfo; { This procedure displays the dialog box and gets the information input by the user. } VAR Done : Boolean; Item : Integer; BEGIN Done:=FALSE; Abort:=FALSE; GetDialog(1); SetField(6,FolderName); SetField(8,RecordName); SelField(6); REPEAT DialogEvent(Item); IF Item=1 THEN Done:=TRUE; IF Item=2 THEN BEGIN Done:=TRUE; Abort:=TRUE; END; UNTIL Done; FolderName:=GetField(6); RecordName:=GetField(8); ClrDialog; END; BEGIN { Main Program. } { Display the dialog box and get the information. } Dialog1; 5:GetInfo; IF Abort THEN GOTO 99; { Check to see that the symbol folder exists. } FolderH:=GetObject(FolderName); IF FolderH = NIL THEN BEGIN Sysbeep; AlrtDialog('No such symbol folder exists!'); GOTO 5; END; { Check to see that the record exists. } RecordH:=GetObject(RecordName); IF RecordH = NIL THEN BEGIN Sysbeep; AlrtDialog('No such record exists!'); GOTO 5; END; { Get the first symbol handle in the symbol folder. } SymbolH:=FInFolder(FolderH); { Attach the record to each symbol. } NSymbols:=0; SetCursor(WatchC); WHILE SymbolH <> NIL DO BEGIN NSymbols:=NSymbols+1; SetRecord(SymbolH,RecordName); SymbolH:=NextObj(SymbolH); END; { Display the number of symbols that the record was attached to. } IF NSymbols = 1 THEN s1:=' symbol.' ELSE s1:=' symbols.'; s:=Concat(GetName(RecordH),' successfully attached to ',Num2Str(0,NSymbols),s1); Sysbeep; AlrtDialog(s); 99:END; Run(AttachRecord);ny,;Any,;Any,;An;A8y,'`T1@Procedure ChangeRecData1; { 1995, Graphsoft, Inc. Developed by Tom Urie This procedure will change the field named 'FieldName' of the record named 'RecordName' in all instances where the record is attached to a symbol which is located in the symbol library folder named 'FolderName'. The value for each symbol is input by the user by way of a custom dialog box which appears for each symbol which meets the criteria. } LABEL 5,10,15,18,20,99; VAR i,j,DialogNo,NFields,NSymbols,NRecords : INTEGER; FolderH,SymbolH,RecordH : HANDLE; FolderName,SymbolName,RecordName,Field,s,s1 : STRING; FieldName,FieldNameD,FieldVal,NewVal : STRING; Name1,Name2:STRING; Abort : BOOLEAN; Procedure Dialog1; { This procedure creates a custom dialog box (Dialog Box #1) which asks the user for the symbol folder name where the symbols to be changed are located and the record name and field name to be changed. } VAR Width,x1,y1,x2,y2,px1,px2,px3,px4,py1,py2 : INTEGER; Procedure AlignScr(Width:INTEGER; VAR x1,x2:INTEGER); VAR scrx1,scry1,scrx2,scry2:INTEGER; BEGIN GetScreen(scrx1,scry1,scrx2,scry2); x1:=((scrx1+scrx2) div 2)-(Width div 2); x2:=x1+Width; END; Procedure MakeDialog1; CONST y1=100; scnh=185; scnw=325; BEGIN AlignScr(scnw,x1,x2); y2:=y1+scnh; px1:=scnw -160; px2:=scnw - 100; px3:=scnw -80; px4:=scnw -20; py1:=scnh-40; py2:=scnh-20; BeginDialog(1,1,x1,y1,x2,y2); AddButton('OK',1,1,px1,py1,px2,py2); AddButton('Cancel',2,1,px3,py1,px4,py2); AddField('_____________________________________',3,1,20,18,305,33); AddField('Change Record Data',4,1,20,10,250,25); AddField('Symbol folder name:',5,1,20,50,165,65); AddField('',6,2,175,50,300,65); AddField('Record name:',7,1,20,75,125,90); AddField('',8,2,175,75,300,90); AddField('Field name:',9,1,20,100,125,115); AddField('',10,2,175,100,300,115); EndDialog; END; BEGIN MakeDialog1; END; Procedure Dialog2; { This procedure creates a custom dialog box (Dialog Box #2) which asks the user for the new value of the field to be changed. A separete box is displayed for each symbol occurence. } VAR Width,x1,y1,x2,y2,px1,px2,px3,px4,py1,py2 : INTEGER; Procedure AlignScr(Width:INTEGER; VAR x1,x2:INTEGER); VAR scrx1,scry1,scrx2,scry2:INTEGER; BEGIN GetScreen(scrx1,scry1,scrx2,scry2); x1:=((scrx1+scrx2) div 2)-(Width div 2); x2:=x1+Width; END; Procedure MakeDialog2; CONST y1=100; scnh=165;scnw=325; VAR i,j,h : INTEGER; BEGIN AlignScr(scnw,x1,x2); y2:=y1+scnh; px1:=scnw -160; px2:=scnw - 100; px3:=scnw -80; px4:=scnw -20; py1:=scnh-40; py2:=scnh-20; BeginDialog(2,1,x1,y1,x2,y2); AddButton('Next',1,1,px1,py1,px2,py2); AddButton('Cancel',2,1,px3,py1,px4,py2); AddField('_____________________________________',3,1,20,18,305,33); AddField('Change Record Data',4,1,20,10,250,25); AddField('Symbol Name:',5,1,20,40,125,55); AddField('',6,1,135,40,300,55); AddField(FieldNameD,7,1,20,75,125,90); AddField('',8,2,135,75,300,90); EndDialog; END; BEGIN MakeDialog2; END; Procedure GetInfo1; { This procedure displays Dialog Box #1 and retrieves the information input by the user. } VAR Done : Boolean; Item : Integer; BEGIN Done:=FALSE; Abort:=FALSE; GetDialog(1); SetField(6,FolderName); SetField(8,RecordName); SetField(10,FieldName); SelField(6); REPEAT DialogEvent(Item); IF Item=1 THEN Done:=TRUE; IF Item=2 THEN BEGIN Done:=TRUE; Abort:=TRUE; END; UNTIL Done; FolderName:=GetField(6); RecordName:=GetField(8); FieldName:=GetField(10); ClrDialog; END; Procedure GetInfo2; { This procedure displays Dialog Box #2 for each symbol occurence and retrieves the information input by the user. } VAR Done : Boolean; i,n,Item : Integer; BEGIN Done:=FALSE; Abort:=FALSE; GetDialog(2); SetField(6,SymbolName); SetField(8,FieldVal); SelField(8); REPEAT DialogEvent(Item); IF Item=1 THEN Done:=TRUE; IF Item=2 THEN BEGIN Done:=TRUE; Abort:=TRUE; END; UNTIL Done; NewVal:=GetField(8); ClrDialog; END; BEGIN { Main Program. } Dialog1; { Display Dialog Box #1 and get the information. } 5:GetInfo1; IF Abort THEN GOTO 99; { Check to see that the symbol folder exists. } FolderH:=GetObject(FolderName); IF FolderH = NIL THEN BEGIN Sysbeep; AlrtDialog('No such symbol folder exists!'); GOTO 5; END; { Check to see if the record exists. } RecordH:=GetObject(RecordName); IF RecordH = NIL THEN BEGIN Sysbeep; AlrtDialog('No such record exists!'); GOTO 5; END; { Check to see if the field exists. } NFields:=NumFields(RecordH); FOR i:=1 TO NFields DO BEGIN Name1:=FieldName; Name2:=GetFldName(RecordH,i); UprString(Name1); UprString(Name2); IF Name1 = Name2 THEN GOTO 10; END; Sysbeep; AlrtDialog('No such field exists!'); GOTO 5; { Determine field name to be displayed in dialog box. } 10:FieldName:=GetFldName(RecordH,i); FieldNameD:=Concat(FieldName,':'); { Display Dialog Box #2, get the information, and change the record for each symbol occurence. } Dialog2; SymbolH:=FInFolder(FolderH); NSymbols:=0; WHILE SymbolH <> NIL DO BEGIN { Get the symbol name. } SymbolName:=GetSDName(SymbolH); { Check to see that the record is attached to the symbol; if not, skip this symbol and get the next symbol in the folder. } NRecords:=NumRecords(SymbolH); FOR j:=1 TO NRecords DO BEGIN Name1:=RecordName; Name2:=GetName(GetRecord(SymbolH,j)); UprString(Name1); UprString(Name2); IF Name1 = Name2 THEN GOTO 15; END; GOTO 18; { Retreive the current value of the field to display in the dialog box. } 15:Field:=Concat('''',RecordName,'''','.','''',FieldName,''''); FieldVal:=EvalStr(SymbolH,Field); { Display the dialog box and get the new value for the field. } GetInfo2; IF Abort THEN GOTO 20; NSymbols:=NSymbols+1; { Change the field to the new value. } SetRField(SymbolH,RecordName,FieldName,NewVal); { Get the handle of the next symbol in the folder. } 18:SymbolH:=NextObj(SymbolH); END; { Display the number of symbols changed. } 20:IF NSymbols = 1 THEN s1:=' symbol' ELSE s1:=' symbols'; s:=Concat(Num2Str(0,NSymbols),s1,' changed.'); Sysbeep; AlrtDialog(s); 99:END; Run(ChangeRecData1);ny,;Any,;Any,;Any,;Any,;Any,;Any,;An;Axy,1 @RMESSAGE('CAUTION: The routines in EDIT SYMBOL RECORD modify symbol definitions.');$hy,'`hQp   XHHHHII)Hcaq a$(,2Ndj"JPt 28T|6^d>D` Bjp8>T|  Layer namey Scale border a@8Z@  theatre-sectionE a@8Z@  theatre-sectionS a@8Z@ ( theatre - sectionNP a@8Z@ 4  theatre-plan a@8Z@ @  th-new plan a@8Z@ L  arena stage a@8Z@ X  arena seats a@8Z@ d  thrust stage a@8Z@ p  thrust risers a@8Z@ |  thrust seats a@8Z@   end stage 1 a@8Z@   end seats 1 a@8Z@   end stage 2 a@8Z@   end seats 2 a@8Z@  catwalks a@8Z@  structural steel a@8Z@  set2 a@8Z@  set1 a@8Z@  rigging a@8Z@  text a@8Z@  Layer-1 a@8Z@y,pAdaq Hc)dxII)Hcaq ay`aGaq0cJaqaqЫ W">@$xRy,6A'`'`pRy,\1@'`'`` y,'`8@K@vg8~uFm"B@E)4'`'`(@@@ !! !! !!5EZ0A=4444444444444Jy,@KcF@oFIvoO@E)4Jy,@Kd}tq*vxDIz_Jy,@KcFqfffffvoO@1vfffffJy,@Kd5ܵxq@fsd{ved1@@~M7 y,'` BKx33333@tƆax@tƆax33333@tƆa?e%?|i'`@c Zy,0A=4444444444444&:@= y,'` BKx33333@Z kx@Z kx33333@Z k?e%?|i'`0@c Zy,0A=4444444444444&:@= y,'` BKx33333_֔x_֔x33333_֔?e%?|i'`@c Zy,0A=4444444444444&:@= y,'` BKf}C\_֔uA_֔f}C\_֔?e%?|i'`8@c &:@=y,'` BKf}C\@tuA@tf}C\@t?e%?|i'`<@c &:@=y,'` BKf}C\@Z kuA@Z kf}C\@Z k?e%?|i'`4@c &:@=Jy,'`@K@\R xuF`g@NrZ0A=4444444444444y,'` BK@S%)$VY:-9@&ۂ@S%)@eY? iKYe%?|i@ iKY'`P@c &:@=y,'` BKy c{Km"BKy c{K?e%?|i'`@c Zy,0A=4444444444444&:@= y,'` BKf}C\,MU&uA,MU&f}C\,MU&?e%?|i'`4@c &:@=y,'` CK@vg8~_֔@g IQ_֔@vg8~_֔?e%?|i'`<@c &:@=y,'` CK@vg8~@tƆa@g IQ@tƆa@vg8~@tƆa?e%?|i'`@@c &:@=y,'` CK@vg8~@Y2%@g IQ@Y2%@vg8~@Y2%?e%?|i'`H@c &:@=y,'`@ CK@vg8~,MU&@g IQ,MU&@vg8~,MU&?e%?|i'`8@c &:@= $@ y,'`<@K@~KGP=Br`j@5'`0'`<HII4RT+Z0A=4444444444444y,'`4 BK@r^ѷ|-@_ k|-@r^ѷ|-?e%?|i'`X@c &:@=y,'`H BK@r^ѷ@2^@_ k@2^@r^ѷ@2^?e%?|i'`T@c &:@=y,'`X BK@r^ѷ@|pydo@_ k@|pydo@r^ѷ@|pydo?e%?|i'`L@c &:@=y,'`` BK_8GU|-r`j|-_8GU|-?e%?|i'`T@c &:@=y,'`P BK_8GU@2^r`j@2^_8GU@2^?e%?|i'`D@c &:@=y,'` BK_8GU@|pydor`j@|pydo_8GU@|pydo?e%?|i'`\@c &:@=Jy,AK@WGP=BXީ @5Jy,@K@Qvfffff1T33333nfffffJy,@K@QvfffffnfffffT3333333333Jy,@K@Qvfffff33333T33333wJy,@K@QvfffffwT33333l33333Jy,@K@Qvfffffl33333T33333S Jy,@K@QvfffffS T33333@S Jy,@K@Qvfffff@S T33333@l33333Jy,@K@Qvfffff@l33333T33333@wJy,@K@Qvfffff@wT33333@33333Jy,@K@Qvfffff@33333T33333@nfffffJy,@K@Qvfffff@nfffffT33333@1Jy,@K@S'RTR4nCWHC,zx@ROy,'` BK@TR xCAU"Z@1&@TR x@͉.?)ffffffe%?|i@)ffffff'`X@c &:@=Jy,@K@t, @@`ErֹsSJy,@K@t\6Na[h+bY@`$YW!@d1n7@Jy,@K@t,@r񜡋b@`E@4,Qy,'`$ BK@~K|-@s0|-@~K|-?e%?|i'``@c &:@= y,'`( BK@~K@+A@s0@+A@~K@+A?e%?|i'`P@c &:@= y,'`0 BK@~K@|p_I@s0@|p_I@~K@|p_I?e%?|i'`d@c &:@= $@= y,@K@V9eZuxF]@a{5X'`8'`Py, AK@V9eZuxF]@a{5X'`D'`Ly,AK@V9eZuxF]@a{5XZuxF]e@V9e@V9@a{5XZuxF]@a{5XZuxF]e fy,AK@V9eZuxF]@a{5W???e@V9#(@?@hWp:dDdDdDdDdDdDdDdDdDdDdDd`` F F F F F F F F F F F ``HHHHHHHHHHH``PPPPPPPPPPP``PPPPPPPPPPP``PPPPPPPPPPP``PPPPPPPPPPP``HHHHHHHHHHH`` F F F F F F F F F F F ``dDdDdDdDdDdDdDdDdDdDdDd`$@G$@;$@̳ y,'``4@K@Q>۲ml@Pp3'`\'`ִ2o Z0A=4444444444444Jy,@K@YffffffZ@?Jy,@K@YfffffffffffYffffff33333Jy,@K@Yffffff33333Yffffff3Jy,@K@Yffffff3YffffffJy,@K@YffffffYffffffyJy,@K@YffffffyYffffffh33333Jy,@K@Yffffffh33333Yffffff@ffffffJy,@K@Yffffff@ffffffYffffff@j1Jy,@K@Yffffff@j1Yffffff@yJy,@K@Yffffff@yYffffff@?Jy,@K@Yffffff@?Yffffff@33333Jy,@K@Yffffff@33333Yffffff@Jy,@K@Yffffff@Yffffff@&33333y,'` CK`tܱF^@ťvFl@ťvF`tܱF^@ťvF?WHbb˧3'``@U*#&:@=y,'` CK`tܱF^@ l@ `tܱF^@ ?WHbb˧3'`d@U*#&:@=y,'` CK`tܱF^@Bѩ!bl@Bѩ!b`tܱF^@Bѩ!b?WHbb˧3'`l@U*#&:@=y,'` BK@qP@+|M@cUh@+|M@qP@+|M?`Lri'`\@]D*&:@=y,'` BK@qP@ä/@cUh@ä/@qP@ä/?`Lri'`t@]D*&:@=y,'` BK@qP@ceO@cUh@ceO@qP@ceO?`Lri'`p@]D*&:@=Ny,AK_p@#,_p@Pp3Ny,@K_p۲m_pQ>y,'` BK@Q>@^\e6@z|[>@^\e6@Q>@^\e6?[ =q'`p@Yffffff&:@= y,'` BK@Q>@P#cW@z|[>@P#cW@Q>@P#cW?[ =q'`x@Yffffff&:@= y,'` BK@Q>@c J"@z|[>@c J"@Q>@c J"?[ =q'`h@Yffffff&:@= y,'` BK@SE@@I]?t@@@SE@@?`Lri'`|@]D*&:@=$@9Ry,\@ '`'` y,'`O@K'@}ѿ{c xLf@c '`'`8         @@62c:0AVJy,@K o@c x{bfffff@c y,'` BK@}ѿ{?t@ @rZ?t@ @}ѿ{?t@ ?e%?|i'`x@c &:@V.y,AK@rأ/DYffffffk@Yffffff@n)Ie@S.@prsGyB@Wjfffff@rأ/D@Wjfffff@rأ/D@S.@p@S.@p@I3e@rأ/D@I3e@rأ/DI3e@pI3e@pS.@rأ/DS.@rأ/DWjfffff@prsGyBWjfffff@n)IeS.@VR S.@QvF!V9`(^ڶYffffff`BV9`BS cQvfffffgQvfffffkB33333k@B33333g@Qvfffffc@Qvfffff`B@S `B@V9`(^ڶ@Yffffff@QvF!@V9@VR @S.y,'` BK@C$I^qX`\*sqqX@C$I^qX?e%?|i'`|@c &:@Vy,'`$ BKqژgjrqX|zV3&qXqژgjrqX?e%?|i'`@c &:@VNy,@K @_S @q@Qvfffffy,'`4 BK~-<@ X`fLf@ X`f~-<@ X`f?e%?|i'`t@c &:@Vy,'`< BK@c cGb @@ cGb @c cGb ?]D*'`@]D*&:@V$@ G y,'`@AK @crfffffej.@b33333'`L'`x@@       ``6ՙ:0AVJy,@K @z} crfffff@lo|N/7@b33333y,'`T BKv85h m)V}ej. m)V}v85h m)V}?e%?|i'`@c &:@V.y,@K @hз=Y&Bszo=:2@YMe`gp+>݋aR q *QW*fleszo=:2W*fleszo=:2R rkx%gR rkx%gI*J@szo=:2I*J@szo=:2@J*r/Yrkx%g@J*r/Yrkx%g@SnܱF^szo=:2@SnܱF^szo=:2@WI< q *Q@WI< p+>݋a@SnܱF^\7~@SnܱF^W=$ @Vy|o'=0_d@YMe`g@[fn@Vy|o'=@[fn@SLJ@`ۭ:`@QI< @dleW@QI< @hз=@C&zN{@hз=B'e47?1@dleWQ6fle@`ۭ:`Q6fle@[fnRN@[fnU0_dY&BW=$ U\7~R y,'`X BK@T!mz-@">WSV)Qa@">WS@T!mz-@">WS?e%?|i'`@c &:@Vy,'`` BK@xRc@">WS@lqeI/@">WS@xRc@">WS?e%?|i'`@c &:@VNy,@K b-4B@SLJrdq.@Q6fley,'`t BK@ m)V}@{!`A7L m)V}@ m)V}?e%?|i'`@c &:@Vy,'`| BKHWZ>du>HWZ>?]D*'`@]D*&:@V$@  y,'`@K@{cϳ1c *\1'@c'`'```p 0 0 0`5#:0AVy, @K@p F#п_oiJ]#@`%?'`'`.y,AK@p F#п_Q V@_PM#g@_@QPOО@_@Y@Kv1@W@kOYnL@W@m@[@p F#п@[@p F#п@^)@p F#п^@p F#п[@m[@kµW@Z ~dW@PB_Q V_y,AKCY6.@ffffffcѤ}@`%?-cѤ}@GA$k#R9& @`%?CY6.@ffffffoӓ#@L ?|y,AK?o e]v c)Oe?,-QТD]v c)Oe@Kc?o e?,d=k @L > Ny,AKdL{|x C niʧXv]*ʧXhT>iʧX?e%?|i'`@c &:@Vy,'`8 BKx5@ ysSd1'@ ysSx5@ ysS?e%?|i'`@c &:@VNy,@K @t=W@t=@WNy,@K @qW@q@W$@ #1 y,'`TAK @>6Nc n@c '`P'`           `6V:0AVJy,@K @{\ c @n/<-@c y,'`X BKunfffffh.‹nh.‹unfffffh.‹?e%?|i'`@c &:@V.y,AK@jxqRWrٺ@[@SLJ@fg ֶZ@SLJ@jxqR@FS@jxqR=0@fg ֶZO@:S@b?>O@:S@^fw-Q6fle@^fw-TcP]CXWT! BTcP]Y~+QXXSy,'`l BK@WH6z@)H:;SaB@)H:;@WH6z@)H:;?e%?|i'`@c &:@Vy,'`t BK@y!Ǝ*@)H:;@n/@)H:;@y!Ǝ*@)H:;?e%?|i'`@c &:@Vy,'`| BK@>6Nh.‹@{0_|h.‹@>6Nh.‹?e%?|i'`@c &:@Vy,'` BKL33333@ N][$e4֡b@ N][$L33333@ N][$?]D*'`@]D*&:@V$@ , y,'`AK @}cϳ1c *n@c'`'``          @R62:0AVJy,@K n9vc *z/ۏ@cy,'` BK@}cϳ1?O@s2Qcz)fg ֶZQcz)jxqRB.'ZjxqR@B8? fg ֶZ@QhhRb?>@QhhR^fw-@R%g^fw-@V+O@CX@YXhR@T! B@V+O@Y~+@S ߹8y,'` BK@HbPZF_^QaF_@HbPZF_?e%?|i'`@c &:@Vy,'` BKqSl3/F_{*F_qSl3/F_?e%?|i'`@c &:@Vy,'` BK}^fffff@ 3n@ 3}^fffff@ 3?e%?|i'`@c &:@Vy,'` BK@hiB!%g@RxF^!%g@hiB!%g?]D*'`@]D*&:@V$@ 4 y,'`AK @>6Nc n@c '`'`        ```62:0AVJy,@K @{\ c @n/<-@c y,'` BKunfffffh.‹nh.‹unfffffh.‹?e%?|i'`@c &:@V.y,AK@jxqRWrٺ@[@SLJ@fg ֶZ@SLJ@jxqR@FS@jxqR=0@fg ֶZO@:S@b?>O@:S@^fw-Q6fle@^fw-TcP]CXWT! BTcP]Y~+QXXSy,'` BK@WH6z@)^wSaB@)^w@WH6z@)^w?e%?|i'`@c &:@Vy,'` BK@y!Ǝ*@)^w@n/@)^w@y!Ǝ*@)^w?e%?|i'`@c &:@VNy,@K a/m@T2-4qWUO@:Sy,'` BK@>6Nh.‹@{0_|h.‹@>6Nh.‹?e%?|i'`@c &:@VNy,@K b|wQI< r6ֈ@RNy,'` BKHWZ>du>HWZ>?]D*'`@]D*&:@V$@ =E y,'`AK @[B& %9XF́Mr{@}^e\O'`'`t  | :fy:0AVJy,@K @Zr6~AifVzOeU1=]OavfffffQvfffff\33333T33333\33333W@)ffffffT33333@V9Qv@[R" ÂNy,@K @T33333@bAeO O@rA{k$@ Jcy,'`T BK@T!mz-ܽۘAV)QaܽۘA@T!mz-ܽۘA?e%?|i'`@c &:@Vy,'`\ CK@[B& %@c@xE*p@c@x@[B& %@c@x?c '`@c &:@V$@ F- y, AK @Zo933333Xtl@A'`L'```4UJy,@K @ZP*;|euT'Ĩ; bD*y,'` BK@U?@AT3@A@U?@A?e%?|i'`@c &:@Vy,'`p BK@QvfffffrbsXtlrbs@Qvfffffrbs?e%?|i'`@c &:@Vy,'`x BK@T! B33333V4933333@T! B33333?e%?|i'`@c &:@V.y,@K@Zo9V9zTX]L'I@z^YDSR%ш/@w;'VaGݔ@xR~VaGݔ@z^YDSR%ш/@z^YDSR%ш/@yOa?KGo޵,@yOa?KGo޵,@z^YDS@Kfw-@z^YDS@Kfw-@yOa?K@T8 Z0@yOa?K@T8 Z0@z^YDS@Xs@z^YDS@Xs@xR~@T8 Z0@w;'@T8 Z0@l&B{[@WBض@iffffff@Zo9@_@WBض@T! B@R9ffffff@RL.aZ@Dg۱lV9zT@8!V9zTPmGݔL.aZPmGݔ9ffffffRxWU0{X]L'I@_U0{@iffffffR%ш/@l&B{[Ny,@K @T! B@pE$tSPmGݔ@yfMnG7y,'` BK@S!R<@\jeV]ce@\je@S!R<@\je?e%?|i'`@c &:@VNy,@K P}@n܏o@S@x0 $@ Om y, AK @Zo933333X]L'I@A'`'```o5&Jy,@K @ZP*;|euT'Ĩ; bD*y,'` BK@U?@AT3@A@U?@A?e%?|i'`@c &:@Vy,'` CK@T33333rbsUKƧrbs@T33333rbs?e%?|i'`@c &:@Vy,'` BK@T! B33333V4933333@T! B33333?e%?|i'`@c &:@V.y,@K@Zo9V9zTX]L'I@z^YDSR%ш/@w;'VaGݔ@xR~VaGݔ@z^YDSR%ш/@z^YDSR%ш/@yOa?KGo޵,@yOa?KGo޵,@z^YDS@Kfw-@z^YDS@Kfw-@yOa?K@T8 Z0@yOa?K@T8 Z0@z^YDS@Xs@z^YDS@Xs@xR~@T8 Z0@w;'@T8 Z0@l&B{[@WBض@iffffff@Zo9@_@WBض@T! B@R9ffffff@RL.aZ@Dg۱lV9zT@8!V9zTPmGݔL.aZPmGݔ9ffffffRxWU0{X]L'I@_U0{@iffffffR%ш/@l&B{[y,'` BK@S!R<@\jeV]ce@\je@S!R<@\je?e%?|i'`@c &:@V$@ W9 y,'AK@wrklTw@iטةz'`'` 0"" "" ""  "" "" ""@x 4%ey, @K@wrklTw@iטةz'`'`Ny,AK @w?fw-^w?fw-^.y,AK @q33333rklT@S@iטةz@pU=pK'@q*33333qZp\n@q*33333rklT@pU=rklT@pU=qupK'T橓 qZp\nT橓 rklTY"$>rklTY"$>quZtF$@ _u$@ ^i y,(AK@unfffffs@unfffff@s8'`'`9N0?2""`("""X("""D8?,       @0?2""D("""X("""`8?/0;p@R4 Iy, AK@unfffffs@unfffff@s8'`'`Jy,AK @t33333s@rEJ@s8Jy,AK@unfffff3ɱ+unfffff@2On.y,AK @rtfffffsZ?@W@iڋ1@ppa6.@qfffffqoO@qfffffsZ?@psZ?@pqb~ @nD*qb~ @nD*sZ?@ac sZ?@ac qb~ @]N(@Th ԕ@Xɠ"%@X6n.@S;:%@Z0F@F|P7@\4֡aVpjDA@\4֡aVpjDA@[/zT`λ@[/zT`λ@\`F!Ny,@K_E]_V[d7<[.@\4֡ay,'` BK@]qS 3H@ b@]qSҿh.‹? iKYe%?|i@ iKY'`@c &:@Vy,'` BKmӮh] 3yY@ bmӮh]h.‹? iKYe%?|i@ iKY'`@c &:@Vy,'` BK@w($ 3@jԪ@ b@w($h.‹? iKYe%?|i@ iKY'`@c &:@V$@ { y,'`AK@yϜc ;Wxɯ@c mHQ'`'` 000p 8 h x s8r":0AVy,AK@gyY\hRfܶs@\4֡afܶs@\[fܶs@Wcz(bs@Wcz(bs@HF]cfܶs@HF]cfܶsG8? bsG8? bsWi\NfܶsWi\Nfܶs[d7]qS[d7]qSZd7TS }lZd7TS }l\hR@Jw\hR@T_BXZd7@Z_BXXhR@^[xTR x@gyYN(Ʌoi@gyY@NC@_D~~@Th ԕ@Z_BX@X6n.@UXU@Z0F@J@\4֡aTS }l@\4֡aTS }l@[/zT^ =ݱ @[/zT^ =ݱ @\`F!Ny,@K]'/jP@[d7@v.\4֡ay,@K @yϜc ;W@lvO @c mHQ @lvO @Dg @lvO Df۔݀@oaIo['c@rZ1c ;W@u/rc ;W@xUZ%['c@yϜDf۔݀@yϜ@Dg @xUZ%@[l3@u/r@c mHQ@rZ1@c mHQ@oaIo@[l3Ny,@K]'/jP[d7@v.@\4֡ay,'` BKl~r2L 3xɯ@ bl~r2Lh.‹? iKYe%?|i@ iKY'`@c &:@Vy,'` BK@xr 3@klRXyy~@cZGAy,'` BKm#@*?yZ@*?m#@*??e%?|i'`@c &:@=y,'` BK@wU=@{zk@ik~'@{zk@wU=@{zk?e%?|i'`@c &:@=Jy,@K hVl!@sqO yy~@?0Dkjy,'` BKm#@}j/֥j@n?з='`'`@@  @A@  p @5|:0AV~y,@K @iffffffn>֥j@n?з=@iffffff?x.‹jn>֥j@n?з=y,@K *..c ;Wh|@c mHQ h|@Dg h|Df۔݀eɯbk/['c`e[)/57Jy,@K@s~EuuWթrAS@pANy,@K#@Oj/H*T"9VRغA*T"9Jy,@K@Oj/HID[F)VC[@8F|y,@K[u h"ĹuY\_|g@e;[کq}@e;`NRXh@e;`NRXh@afpޏm@afpޏm@e;qw),I4@e;qw),I4@asoG@asoG@e;u)RP@e;u)RP@[QatکRP@[QatکRP@Q=duY\_|g@Q=duY\_|gNbRtکRPWGwBVt*\_|g];wBVsDC`ؔqRPh"Ĺdy%_5h"Ĺa=\:`̊aN`pޏm];wBV]qXWJœ[u Oz* 8[u @Q=d]>C 7@Q=d]>C 7@["WB\ v>Jj@["WB$@  y,'`<HAK@ghΑgHw1z@f"h ԕ'`H'`d"""`"``0` ` 06 :0AVJy,@K@c gHw1d33333@f"h ԕy,'`P CK@>+^R)d}zc1)d}z@>+^R)d}z?g~AW'`@e*8&:@VJy,@Kl33333e֔z@`gy,'`T BKojeZ?z\ǫZ?ojeZ??e%?|i'` @c &:@Vy, @K@ghΑ`z&@3 X@Wʻ$@ghΑ`z&?dzG@l`A8'`\ @c UV$@ # y,'`lGAK@xo޵,enfffffs$17@abw'`'`$D      6~:0AVy,@K@xo޵,c@jU6z@abw6zc@jU@l]9~c@jU@xo޵,[~+@xo޵,@W @l1-#N@abw6z@abwy,'` BK@c\%*0N??'3^ %*0N?@c\%*0N??g~AW'`@e*8&:@VJy,@KYenfffffs$17@`33333y,'` BK_fw-Y>rfY>_fw-Y>?e%?|i'`@c &:@VNy,@K @kX߽jY:c@jU@kX߽jY:@aY%cgy,@K@v//fǟfb5W'Svfǟfb5SX6*^x[jU Rn(-UR+`Qq]_VD*b{q]_V@A&Vo^_BX@Q~k7$~d@Q~g!x@STwNg!x@WvCUkr>@Z$nC@G2/'5@W6+o@RJ[@TK{?D@id9 @TK{?D@sEٵ[y@`E$Jy,@K t-Svc ;Wh[G@c mHQy,'`( BK@?CcH@wutj~?CcH@?CcH?e%?|i'`@c &:@Vy,'` BK@#v_ح!i.Կ!@#v_ح!?e%?|i'` @c &:@Vy,'` BKvcޢLƂ!{?0aǛ!vcޢLƂ!?e%?|i'`@c &:@Vy,'` BK @\-+Jg+@\-+?]D*'`@@]D*&:@V$@ K y,'`$&AK @tޢLƂsA@'`D'`""""""16mZ0A=4444444444444y,'`, BK@tޢLƂ;@d}ǫ;@tޢLƂ;?e%?|i'`H@c &:@=Jy,@K \P ԮBͫs5xΉeny,'`8 BKbC\;sA;bC\;?e%?|i'`(@c &:@=y,'`@ BK@tޢLƂh.‹@d}ǫh.‹@tޢLƂh.‹?e%?|i'`(@c &:@=Jy,@K \P ԮBc s5@c y,'`L BKbC\ѿh.‹sAh.‹bC\ѿh.‹?e%?|i'`$@c &:@=y,'`T BK@tޢLƂ@q0H(@d}ǫ@q0H(@tޢLƂ@q0H(?e%?|i'`L@c &:@=Jy,@K \P ԮB@w\`s5@4y,'`` BKbC\@q!W?sA@q!W?bC\@q!W??e%?|i'`T@c &:@=y, Z@K @^oטةzL4r@'`h'`Jy,AK@^oטةzL4r@Jy,AK@TB(|=%@@U @Jy,AK@TB(|= @U Jy,AK@TB(|=@U v+MJy,AK@TB(|=@U ]Jy,AK@TB(|=@+M@U |Jy,AK@TB(|={I@U vSJy,AK@TB(|=u@U pJy,AK@TB(|=m@U cJy,AK@TB(|=a]@U MRغJy,AK@TB(|=@MRغ@U @a]Jy,AK@TB(|=@c@U @mJy,AK@TB(|=@p@U @uJy,AK@TB(|=@vS@U @{IJy,AK@TB(|=@|@U @@+MJy,AK@TB(|=@]@U @Jy,AK@TB(|=@v+M@U @Jy,AK@TB(|=@@U @ Jy,AK@TB(|=@@@U @%@$@ Ey,'` BK@ZQvY@)KzykP+ey@)Kzyk@ZQvY@)Kzyk?e%?|i'`D@c &:@=$@ ͵ y,'`PAK @c ;W{?0aǛ@c mHQ'`'`            x63B:0AV.y,AK@uϢXSax3q]_V@adb@uϢXS@adb@uϢXS@ZF@tmٺ@ZF@tmٺ@NGi+<@uϢXS@NGi+<@uϢXSJ__@tmٺJ__@tmٺ[I#_@uϢXS[I#_@uϢXSarlu@s^t)ax3@jш/S`ԙ@S(r6~S`ԙ@J"ӲVǭl5E.]MZF>//fǟfb5W'Svfǟfb5SX6*^x[jU Rn(-UR+`Qq]_VD*b{q]_V@A&Vo^_BX@Q~k7$~d@Q~g!x@STwNg!x@WvCUkr>@Z$nC@G2/'5@W6+o@RJ[@TK{?D@id9 @TK{?D@sEٵ[y@`E$Jy,@K t-Svc ;Wh[G@c mHQy,'` BK@?MZ@wutj~?MZ@?MZ?e%?|i'`0@c &:@Vy,'` BK@#v_ح!i.Կ!@#v_ح!?e%?|i'`,@c &:@Vy,'` BKvcޢLƂ!{?0aǛ!vcޢLƂ!?e%?|i'`X@c &:@Vy,'` BK @\-+Jg+@\-+?]D*'``@]D*&:@Vy,@K@q>EYXS;w@j(m@XF^"@q>EYXS;w@q>E@XF^"@j(m@O&V@j(mNsB$@ o y,'`QAK@yϜc ;Wxɯ@c mHQ'`'`H 00 p   x :MW:0AVy,@K @yϜc ;W@lvO @c mHQ @lvO @Dg @lvO Df۔݀@oaIo['c@rZ1c ;W@u/rc ;W@xUZ%['c@yϜDf۔݀@yϜ@Dg @xUZ%@[l3@u/r@c mHQ@rZ1@c mHQ@oaIo@[l3y,@K@gyY\hRfܶs@\4֡afܶs@\[fܶs@Wcz(bs@Wcz(bs@HF]cfܶs@HF]cfܶsG8? bsG8? bsWi\NfܶsWi\Nfܶs[d7]qS[d7]qSZd7TS }lZd7TS }l\hR@Jw\hR@T_BXZd7@Z_BXXhR@^[xTR x@gyYN(Ʌoi@gyY@NC@_D~~@Th ԕ@Z_BX@X6n.@UXU@Z0F@J@\4֡aTS }l@\4֡aTS }l@[/zT^ =ݱ @[/zT^ =ݱ @\`F!y,'` BK@_,@Ъ sWpDrT@ TT+ @_,@Ъh.‹? e%?|i@ '`P@c &:@Vy,'`( BKl~r2L sWpxɯ@ TT+ l~r2Lh.‹? e%?|i@ '`8@c &:@Vy,'`0 BK@xr sWp@klI@ZQF$@XUHY@T33333b_ @N)b_ NV?T)Zl]QF$X5H!u6Z12\@]Xo \@]Xo [/@c=)V:[/@c=)V:\`fffffy,'`P BK@L2ar 3\1Nn"@ b@L2ar h.‹? iKYe%?|i@ iKY'`d@c &:@Vy,'`X BK@x^ѷ 3@l|@ b@x^ѷh.‹? iKYe%?|i@ iKY'`l@c &:@Vy,'`` BKj)^ 3w$ x@ bj)^h.‹? iKYe%?|i@ iKY'`\@c &:@VJy,@K@ch߽jY:\_|@VzԲt@\$@  y,'`pUAK@zI2,c ;W @c mHQ'`t'`00 p        ` 8:0AVy,AK @zI2,c ;W@mWAg\@c mHQ @mWAg\@Dg @mWAg\Df۔݀@p:; ['c@rAg\c ;W@v ~Ec ;W@x?b['c@zI2,Df۔݀@zI2,@Dg @x?b@[l3@v ~E@c mHQ@rAg\@c mHQ@p:; @[l3y,'` CKt1烩mL3 烩mL3t1烩mL3?e%?|i'`@@c &:@V.y,AK@jaNY_?R&WrGI@YmyЦvp>݋aS'#xq%ӶWc?R&WrGIWc?R&WrGIS'#xq́S'#xq́I^#rGII^#rGI@Ibq́@Ibq́@S6mrGI@S6mrGI@WqyЦvq%Ӷ@WqyЦvp>݋a@S6mY`؇@S6mTC(f^@V@٩eb@YmyЦv@^fn@V@٩@^fn@Sܠ@bq2@Q}yЦv@fPleW@Q}yЦv@jaN@ByRژ@jaNB_@fPleWQo?R&W@bq2Qo?R&W@^fnS@^fnV2r/YebY_?R&WTC(f^V2r/YY`؇S'#xy,'` CK@[u?";LڹY?";@[u?";?e%?|i'`<@c &:@Vy,'` CK@yY3333?";@m&x?";@yY3333?";?e%?|i'`p@c &:@VNy,AK h{( @"sOq;Qo?R&WNy,AK h{( @"sOp3r;@Q`~~y,'` CK E~($Md5)^ME~($M?]D*'`x@]D*&:@V$@  y,'`"AK@;'c ;W`9%{@c mHQ'`'`    @@@@@   `@@006:0AVy,'` BK@;'?co;!>@{e֐V?co;!>@;'?co;!>?e%?|i'`h@c &:@Vy,AK@}a'acYnLjW-@`ę@k@S [@t@^\j@{@^\j@}^fffff@`ę@}a'acYnL@{ V_@t_@kS5#c@YֶsS5#c@TVRV@\̉@_JYm%o^^uzV@\̉^uzSbwbg=JQ})V}fF`|AQ})V}jW-BF^"jW-@B DfF`|A@Qo\лobg=J@Qo\лo^uz@S 7!^uz@V2ڐ@_J@Y_3vO@TVR@V2ڐ@Yֶs@S(0 Jy,@K n#c ;WzY}I׺@c mHQy,'` BK@H!]ts!@H!?e%?|i'`H@c &:@Vy,'` BKqBͯJƿ!{mmz!qBͯJƿ!?e%?|i'`D@c &:@Vy,'` BK}N ԮB@ )8m`9%{@ )8m}N ԮB@ )8m?e%?|i'`|@c &:@Vy,'` BK@d|%7@FV@7@d|%7?]D*'`@]D*&:@V$  y,'`AK@dSњgLf@dY'`'`(   @@@@@@ @@@66x:0AVy,'` BK@?ܽۘA@@3~?ܽۘA@?ܽۘA?e%?|i'`t@c &:@Vy,@K@d@8dSњiλ@dY@ofU@R!%@O8@c0 a@@c(r6~@d@8@dY@d@8dSњ@c@O8c@ofUT<VP@[T<VP@Vb WFbk/@'DZsx$˟\ WFbk/\ Tⴕbaȁq.R|N/7ep hUTR|N/7iλD_^iλ@@cep hUT@PiT.aȁq.@PiT.\ @Q7\ @U,+4a@'D@XYP~@Vb @U,+4a@[@R!%Jy,@K mBUcd1@z?dC@bAdy,'` BKpOm{jxEmpOm?e%?|i'``@c &:@Vy,'` BK@ML Ǵ{Ԍ[U>{Ԍ@ML Ǵ{Ԍ?e%?|i'`L@c &:@Vy,'`X BK}z.w ,GgLf,G}z.w ,G?e%?|i'`@c &:@Vy,'`< BK @gm.ț+V`^i@Q8; @ 74@gm.țQھ'? iKY]D*@ iKY'`@]D*&:@V$  y,'`0JAK@Yfj.ϦYffffff@H'`8'`|`@@P@`M:_Zy,0A4444444444444:0AVJy,@K @X*=yS.ϦVMnjU!y,'`@ CK@WHL@J@HS7@H@WHL@J@H?e%?|i'`@c &:@Vy,'`H BK@X6xǒ(Rgxǒ(@X6xǒ(?e%?|i'`h@c &:@Vy, @K@YfjfB҄Yffffff@tq#[O'`P'`h.y,AK@YfjfB҄Yffffff@tq#[OS.3L^@q,yp.fWjb= @r fYWjb= @tq#[OS.3L^@tq#[OS.3L^@svy I3e@svy I3e@tq#[O@I>B@tq#[O@I>B@svy @S.@svy @S.@tq#[O@Wjfffff@tq#[O@Wjfffff@r fY@S.@q,yp.f@S.@`ts%@V9@[i-°@Yfj@@:@V9Wc @S Wc @Qvfffff]8|N@Qvfffffbg۱l@B33333fB҄B*~ZyfB҄Qvb= bg۱lQvb= ]8|NS Wc V9p?-6z@n`@9*͞@4 ?k<}|1l@k<}'`@yffffff18&:@e$P M y,/AK @W&&RO` )k3@K#x'`'`4"FJy,@K*@W&&RO` )k3@K#x$@  y,IAK@2w#@W|j/I@2c]Е'`'`8p7 Ny,AK@W|j/I@2c]ЕNy,AK@@DɅoi@W|j/I@2w#@ޙj/$ Q y,'`AK @}cϳ1bAˉ֭n@cB'`'`8```     ;:b><0AV53y, AK@}cϳ1bAˉ֭n@cB'`'`Jy,AK n9vbAˉ֭z/ۏ@cBy,'` CK@}cϳ1@,U`1@s2Oܓ'fg ֶZOܓ'jxqR?-µjxqR@El {fg ֶZ@R%gb?>@R%g^fw-@T5q^fw-@W+X@CX@ZR @T! B@W+X@Y~+@T oz _y,'` CK@HbPZ@WV^Qa@WV@HbPZ@WV?e%?|i'`@c &:@Vy,'` CKqSl3/@WV{*@WVqSl3/@WV?e%?|i'`l@c &:@Vy,'` CK}^fffffSyl.Cn@XW7 }^fffff@#w->Z?UQe%?|i@UQ'`@c 53&:@VNy,AK @Y&@T}0F@pB-R%mz-y,'` CK @dǟfb5?ژgjrd@Hr6?ژgjrd@dǟfb5?ژgjrd?]D*'`@]D*&:@VNy,AK @Y&R%ш/@pB-@T&ر$ e$@  y,'` @AK@wg8~gzy xN7@g'`$'`L@@@@@@@ 0      08~:0AVy,'`( CK@wg8~@˃@iIQ@˃@wg8~@˃?e%?|i'`@c &y,:@V:0AVJy,AK dCTd퀡{zy xN7@c y,'`P CKlqC\?烩mL3xA?烩mL3lqC\?烩mL3?e%?|i'`@c &:@VJy,AK @ZbfUg[.Jה@gy,'`D CK@V}xF]@Q~wSFu@Q~w@V}xF]@Q~w?e%?|i'`t@c &y,:@V:0AV$ '$@a Pff33̙ff33ff33ffffffffffff33ff33333333ff333333ff33ff33̙ff33̙̙̙̙ff̙33̙ffffffffffff33ff33333333ff333333ff33̙ff33̙̙ff33̙ff33ffff̙ffffffff33ff3333̙3333ff333333̙ff33ffffffffffff33ffffffff̙ffffff33ffffffffffffff33ffffffffffffffffffffffff33ffffff33ff33ff33ff33ffff3333ff33ffffffffffff33ff33333333ff333333333333̙33ff33333333333333ff33333333ff33ff33ff33ffff33ff3333ff3333333333333333ff333333333333333333ff333333ff33̙ff33ff33ffffffffffff33ff33333333ff333333ff33wwUUDD""wwUUDD""wwUUDD""ݻwwwwwwUUUUUUDDDDDD""""""y,'`\0@PsWWթyTl@)K'`d'`|@)KPs@k =oWWթyTlk =o Center LineHuMUiH},@FXAXTO@@H?Nņ(EgԈ| VļBԑ*ⴕį«X?Ģ蕿E |IzĻgk@{bAR1; @aZ1ŇzAs^ŮҀjӻ~(Ny,@K;&VC\B鉜5jܱNy,@K;ʸ%O@1O3DbVNy,@Kð ~(&VCNy,@K͝| Y5u y)[x̚Ny,@K (ܘƱ5(ܘlNy,@K Rmv(ܘlNy,@K;q\$Kc{[3Ny,@K గcOగcwdaNy,@K 1љcCB؄Ny,@K !s^^jq^pԱF^Ny,@K ]KKr q, omy,@K g ^ గc ooగc ^ g ooR ^ m)V@L\y,@K |p.fEʸ!s^GB^v!s^^jqHkh>>@^}}ry,@K *-֥hc{[(c3*-֥hc{[i΢c3@Ĺ=+y^CTf}a@19/rCy,@K zdӯw+ Ny,@K hdQ0MrO0c xNy,@K -֥ <_bk-֥ ӯ]=Bbk@+z)vPf@1CPy,@K dc|r*K&H 3i&H *KRʟ8? H''mr@Q>ޞNy,@K )}dQ0qcS`Ny,@K;Ub= RUb= H5Ny,@];”b= ^4 Z”b= *LNy,@K;Ub= n؂Rȣr`n؂RNy,@K {֥@//Asz@A>//Bv@;r}̀Cuw@60/N _@"N߀,Jm3 @īP; c@h>Eņ(Eg@9|}| V@ R* *ⴕ@x ?@: |Iz@ `Vk@{bA@"F;@X4a@ď[)1@AFzAs^@8ǀj@"qT?Ny,@K;&@\B鉜@ń˚Ny,@K;ʸ@;ڰcz@1O3D@$^cbNy,@K@T?&@Ny,@K͝| Y@ń+XRm)@dZ@Ny,@K (ܘ@Iz(ܘ@`RVNy,@K R@="v(ܘ@`RVNy,@K;q\@sFc{[@łDNy,@K గc@_czగc@,ŸUNy,@K 1@WoZc@4Ny,@K J@ tꍨJ@.Ny,@K !s^@Zv\^p@+}Ny,@K ]KKr@@f,@X$'77y,@K ,@X$'77V7.@Z8إ,@X$'77V7.@Z8إR@Z8إ@f@L my,@K i+=@*~^w@-'9i+=@*~^w@-'9JJ1@-'9@f@M="$y,@K sc@$>]KR@D-EARsc@D-EAR]KR@: R@D-EAR^3@^3y,@K J@,@N!K"@.J@.!K"@Zez@.^}}qT@^}}qTy,@K \lcz900+@za/cz9\l@za@ĸ-@CM\i^X F@; -Ny,@K @i@ar 6-֥@L_Ny,@K 6-֥@L_cʸ@|NaZNy,@K a/ @vqya/ @ IzNy,@K a/ @ZczJ@czy,@K *.5͐cm@F6V)vc*.5͐@F6V@Ĺ=+@I}0Fhiŗ@1og+y,@K zf1/@U/If?@NPf?@NPϺ@U/IAR@U-6Z{_@Q=SNy,@K hdQ0@Q_80c@7j@y,@K 0$ɜc =)V:@Sg_}CRc =)V:0$ɜ@Sg_@+@Pe#pGhiP@1{By,@K f$l@b5a4& 2@[N& 2@[N 3@b5a4R@b5`6Zk@Q="gNy,@K )}dQ0@^BJ'kqc@DRy,@K W#IqVbn7Q@lz.*k"bn7W#IqV@lz.*@1Xu @9'i^<@;yD"(jy,@K K4b1fOA@o#i+=b1fK4@o@`B˶>i^LB@;JXnNy,@K;Ub= @NUb= @ʗtIzNy,@K;]x=@`(^R@.'[ >y,@K;ku-@@bLku-@nLym@$+:uG@n xNK@{伭@T?߽jY@! i@t@i$/߂@]T? R@SI;"VԀu@I4hĵ9F@?CrqQ; @6;:jԭ,@. zgb0@& Dt8إ@1>a@̫֔)P~@m3!@ C7Cc#R@wI+@G9OI!ln @0f'9@($^bn*@{q6@sPÁƆb@.$+Mkr?@A[#@G$:C@KEXN?@EZ}fȣr`@NaZ~e@AVi|W#F@> 4~9@wBVud0+@ ɣ@#f~0>FI@ QkB@)r ,8@%)mpu@-.~a'O@6%@?}s3v@H;66k@R'V6] t@]rW?1n@i/+w@u2hRgz,@vFL_@!JGp?-@Lab1f:@ھ''@5-6_Ru@fi^IAr@Nl.d"WB@/g./@`6vF@<g۱l@664@% q D#@7A[x̚@HK'xٺ@[H^=(:@m.'[>)k@a. Rh8@33333f GϢj@&[xmĤ@%Dվ@@,+6@lrts@Iz@۔V'a@yf#ѰE4@-&01.@@^as^@TWsPA$~@h!5Ɔa@{µRk/#@:F#п@ F@X>@˟ % RC@"-^@G@:mt?O@u^c@*c,zxZ@oo@xEZ}D~U@bL$ILʳ@_#FV%JU@Zwt?@$+/ @`c}9@4 Q*@ 0n]bR@e+N@伭8A$~@VL'z@fK#\@@0#mry @'y~@|/L@bs@ i@bb0fP@;q)@ ܃#5Y|@ o`@]Ny,@];”b= @¬”b= @PANy,@K;!zȣr`@A /@´;ZN!zȣr`@:cz.;@"xOLnm@!F1R@Ϸb@s@fUz1@P/rR@>) ~@3rM77@ȣr`,G@%Nn"Bԑ@neZL/@g#-dQ0@c,CA[#@EO@t+@q@wRi^@A e$v@PNZ:%@ǥBU>Y@?^qzN@"@+M:@K/V/@@>p~@j(ܘW@cA 8? @u-B؄@'+EO&I@*brK@1-F@Y2IuKj@3"?{@r/Y.'[@4QjGej@ {( )m@l:*@ш0MZR@k*b|aЍ@A tT]@k*b|Pm@ш087 ܇@l>//@ {•@4Qjx@r/Yv9y@3".@Y2I8إ@1-&O@*b:+U@'+EM>//@u`&01@cAs4X!@j(ܘ[S @>p~)@K/V'@"@+MpC@?^ϙ6@ǥBMO@PNZ4X!@A erC{@wR$}@&һ#W@t6~l!@mF~(Eg@ԀuV|N/@vey @ĤstGV@ (~Y@6R@ؐpU:@"C,z͢@+&hBԑ@3`4Cq@<q O4/Q@D]ЕE4w@M۔8'@Vk{;@_7>3@i:VX˒:@r^>@|̣ &쿱[@|µ=@Ի(@RRG@uK $@+;$?@Fs'@xt*1@mz3,p?-@օ3.+"@B;.ŸU@5/@덂4.BJ'k@%;-t?O@'O+G@ FU:)Kc,C@ug۱l&JN@|V "Su@$Z&ù(l}^_@-y /@5$_Z%A@>fo @F?qTA^@NS,B@V?v'9@^Oaz@ez/v@ma@tY/bD@{|_d@‚u@5z53"@†-ɒ>p~]@‰ 2,@^|PN@4v)T@”=k"rN@—%h{@šʕ Ez@@Np@¡3K@¤x{ 5Gi@¦蕿Esf 0@©GNkUv@¬{QzFc3@¯&bn*[+@±z$Sx@´;ZNNy,@K;Sx@´;ZNR@FNy,@K;R@F+e}@\dTbNy,@K;a/ @¬+e}@b:Ny,@KΖR@AFfdQ0@&tIzJy,@K |ZN@bp3;(Ǖp?-@&foJy,@K ]_ס<%@D'J\@ȏ=Ny,@K F@D'F@ň ZNy,@K j+g0@D'(z@ň ZNy,@K ]_ס<%@QAFQ/@#z,Ny,@K ]_ס<%@ǐFQ/@ǐFNy,@K F@ȏ=F@ ZNy,@K ƀIQ@ȏ={*~Z@ ZNy,@K ]_ס<%@QdQ0Q/@ɀ Ny,@K ]_ס<%@ QfoQ/@ QfoNy,@KJ\@LX(z@gwFNy,@KJ\@QAFa/ @ tIzNy,@K J\@Ǒ=a/ @ǐFNy,@K N4 @ȏ=F@ ZNy,@K J\@QdQ0a/ @~O RNy,@K J\@ Qfoa/ @ QfoNy,@K F@bp3;|ZN@bp3;Ny,@K F@ň ZQ/@ň ZNy,@K |ZN@bp3;|ZN@&foNy,@K Q/@ň ZQ/@ ZNy,@K Q/@ Za/ @ ZNy,@K (Ǖp?-@&fo(Ǖp?-@bp3;Ny,@K a/ @ Za/ @bp3;Ny,@K F@ň ZF@bp3;Jy,@K [`6@tIz(z@h}0GJy,@K]b= @%F(Ǖp?-@^}0GJy,@K'c@%FQ/@^}0GJy,@K]b= @=(Ǖp?-@&foJy,@KQ/@=U@&foJy,@K]_ס<%@SX ZƀIQ@Ȍ~p3;Jy,@K*Mj@}0Gq:տ@4Jy,@KNR@SX ZXZ)@Ȍ~p3;Jy,@K$&@}0GJ\@4Ny,@K@:p@Ǘcz@4 V@ǗczNy,@K;@g=@ǝtIz@!4 V@ǝtIzNy,@K;@eg=@ǝtIz@5@ǝtIzNy,@K;@&p@Iz@r5@IzNy,@K;@r5@Iz@r5@ʊFNy,@K;@̌4 V@ʊF@@둴@ʊFNy,@K;@&p@F@&p@AFNy,@K;@&p@F@5@ǝtIzNy,@K;@@둴@C-@7둴@C-Ny,@K;@7둴@]AF@@둴@]AFNy,@K;@7둴@]AF@7둴@C-Ny,@K;@@둴@ʊF@@둴@ZczNy,@K;@@둴@C-@@둴INy,@K;@@둴^5@2s^^5Ny,@K;@2s^^5@2s^š>5Ny,@K;@@둴š>5@@둴h~5Ny,@K;@@둴'r@@둴^5Ny,@K;@`둴h~5@@둴h~5Ny,@K;@M#hh~5@@둴h~5Ny,@K;@s^K@KNy,@K;@M#hK@@+MKNy,@K;@K@Ey4v)Ny,@K;@M#hK@M#hs2hRNy,@K;@M#hs2hR@M#hs2hRNy,@K;@M#hs2hR@M#hh~5Ny,@K;@t V$5@t VONy,@K;@t VO@ᴁ VONy,@K;@ᴁ V̒hR@ᴁ Vn؂RNy,@K;@M#hK@†5b~5Ny,@K;6^$56^n؂RNy,@K;ȣr`$5ȣr`˔hRy,@K#:G#X5i^ɏki^ɏk#:G#X5i^X5@Vy,@K@iHS>5@6 8 @iHS>5@6 8 @iHS8 @f@VJy,@K @@+Mɋg@r QIJy,@K @ Q*|/@т QIJy,@K @ҹs^=l @ҭ:@+MJ8? Ny,@K @@둴 z@r Q zNy,@K @r Q z@r QIJy,@K@o}ܥ}kr?@#Ȇ zy, @K @5z@Iz@!5Gi@}0G'` '`,Jy,@K @5z@Iz@!5Gi@ vJy,@K @*z$@Iz@?H@}0GJy,@K @5z@ɼ =J@!5Gi@}0G$@ y, @K @5zɾ5@F˾5'`@'`<Jy,@K @5zɾ5@FʰXRJy,@K @Fɾ5@5z˾5Jy,@K @5z%O@F˾5$@ y, @K a7&@}0G'c@}0G'`X'`LJy,@K a7&@}0G'c@ Jy,@K u xN7@}0GxE@}0GJy,@K a7&@AF'c@}0G$@ y, @K gF#пɾ5G"ɂ˾5'`l'`hJy,@K gF#пɾ5G"ɂʰXRJy,@K xEɾ5{ܣ_˾5Jy,@K gF#п%OG"ɂ˾5$@ %y, @K @Ұg Q@Iz@>@+M@Iz'`'`tJy,@K @Ұg Q@Iz@>@+M@ZczJy,@K @}@+M@Iz@p Q@IzJy,@K @Ұg Q@ɿ@>@+M@Iz$@ Jy,@K @s^}kr?@' Qry, @K @=ɾ5@5N5˾5'`'`Jy,@K @=ɾ5@5N5ʰXRJy,@K @˴N5ɾ5@˚=˾5Jy,@K @=%O@5N5˾5$@ wy, @K @Ҫ s^ɾ5@7둴˾5'`'`Jy,@K @Ҫ s^ɾ5@7둴ʰXRJy,@K @w@둴ɾ5@js^˾5Jy,@K @Ҫ s^%O@7둴˾5$@ Ny,@K@ Q'r@ Q3Gby, @K 1Or\M1r'`'`Jy,@KjcʸCXReBx%ONy,@Kr\ݾ51ݾ5Ny,@K5RO5RM1r$@ y, @K 1@aZ1\@J4Iz'`'`Jy,@Kcʸ@Z'?B@x}0GNy,@K1\@ 1@ Ny,@KR@aZR@J4Iz$@ YNy,@K;@>k@ʗtIz@>k@JmNy,@K;@5Gi@ʗtIz@5Gi@JmNy,@K;@5Gi@ʗtIz@㴁 V@ʗtIzNy,@K;Ub= @ʗtIz@>k@ʗtIzNy,@K;@5Gi@Jm@Ǵ=@JmNy,@K;-֥@Jm@>k@Jmy,@K Iz_nG/h^dˁJIz_nG/h^dˁJ@Ĺ=@_-(f^f|X@;r-y,@K z| zڦxe:/߭z| zڦxe:/߭@圉'R[Ԫfzf CD@;ymy,@K N#yUeׇ-N#yUeׇ-@+4GRftl<@;JSpNy,@K֥@aIz@㴁 V@aIzNy,@K@㴁 V@ǝtIz@㴁 V@aIzJy,@K@qg=@ȴڰcz@ 5@tIzNy,@K @=@ǐF@=@FNy,@K @=@F@XM#h@FNy,@K @XM#h@F@XM#h@Ȃ Ny,@K @XM#h@Ȃ @㴁 V@Ȃ Ny,@K@5Gi@Iz@5Gi@aIzNy,@K@5z@m@5z@XmNy,@Ks_@s_@aIzNy,@K}s xN6@g}0G}s xN6@aIzy, @K @Li6@3Q@ E@3ܣCE@Li6@dzZ ?ěUu%?|i@ěU'`P @c OVERHEAD OBSTACLES IN THIS AREA Jy,@K@'9@tIz@?K@}0GNy,@K@'9@}0G@?K@"Ny,@K@{C؜@}0G@'9@"Jy,@K @'Hi@AF@{C؜@czJy,@K @Rr6~@m@!Hi@G}0GJy,@K @q=Nr@AF@; @czJy,@K @; @m@,p@G}0GJy,@K @k=Nr@AF@; @czJy,@K @ n?@Iz@R@Jy,@K @; @m@&p@G}0GJy,@K @=Nr@֚cz@;; @tIzJy,@K @8j@m@7\@G}0GJy,@K @7\@֚cz@k)Zl@tIzJy,@K @8j@m@?7\@G}0GJy,@K @!'9@AF@k@czJy,@K @¸j@֚cz@v7\@tIzJy,@K @)Zl@m@'9@G}0GJy,@K @c)Zl@m@'9@G}0Gy, @K @!aA@_^6*^x@en@ȳ4@en@_^6*^x?e%?|i@1'` @c FOH CIRCUIT PATCH PANELeNy,@K\zԲt@tIz@F@tIzNy,@KdF#п@}0G@F@}0GNy,@K.Ǖp?-@h}0G.Ǖp?-@By, @K  *w@MvHH0@ƿk *w@Mv?l1l@lr ě'` @iffffffUPNy,@K ~@ vzȣr`@ Jy,@K@5Gi@ @q5Gi@SIzJy,@K@k@F@>k@P}0Gy,@K@gT3"@Isi@vB@ͮ`hĵ@gT3"@^9-Dܩ@!hĵ@ͮ`hĵ@vB@͙BJ'k@7O*@Isiy,@K@$}@\BJ'k@8j@BJ'k@8j@\BJ'k@$}@&|8@q5Gi@\BJ'k@UWK@Wq&Jy,@K @F@5ڰcz@>_Rv@ʛ?FJy,@K @q8j@5ڰcz@ '9@ʄg}0GNy,@K @5z@Scz@q8j@SczNy,@K @5z@ F@q8j@ FNy,@K@5z@}0G@5z@y, @K @n@Nju@scEkD@q@n@W%?l;dZ@l'` @c UP TO GREEN ROOMJy,@K@U QX@ǣ|ZN@Ȼ4IzNy,@K@U QX@ǣU@Ȼ4IzNy,@K@U QX@ȴڰcz'c@ǣy, @K eYTm@QzFuL@Jr@gYeMaeYTm@QzF?e%?|i@nj~#'` @c PCPJy,@KP2GA@Ů'}0G|ZN@wZczNy,@KP2GA@wZczU@Ů'}0GNy,@KJ ~d@ŧU@wZczy, @KnR߽jY:@*/y+R@*nR߽jY:@*/?e%?|i@zIlD'` @c SUPPLsy, @K@+5Gi@qJ@h{@|qJ'`@'`,Jy,@K@+5Gi@qJ@h{@|qJNy,@K@+5Gi@qJ@h{@p>p~Ny,@K@+5Gi@vn @h{@qJ$@ y, @K@Lab@&C@gMn@|&jj'`0'`DJy,@K@Lab@&C@gMn@|&jjNy,@K@Lab@&C@gMn@osUvNy,@K@Lab@u$@gMn@&C$@ }y, @K@5Gi@qJ@h{@|qJ'`H'`XJy,@K@5Gi@qJ@h{@|qJNy,@K@5Gi@qJ@h{@p>p~Ny,@K@5Gi@vn @h{@qJ$@ y, @K@$+@g}0G@9GIj@ʄg}0G'`\'`pJy,@K@$+@g}0G@9GIj@ʄg}0GNy,@K@$+@g}0G@9GIj@wIzNy,@K@$+@~ @9GIj@g}0G$@ y, @K@ԙ@ -ש@@@f@ʅ 6*^x'`x'`„Jy,@K@ԙ@ -ש@@@f@ʅ 6*^xNy,@K@ԙ@ -ש@@@f@xVvlNy,@K@ԙ@~@@@f@ -ש$@ !y, @K@{-\@I'Y[@ LH@ɹJHn@ LH@I'Y[?l1l@AR'`Œ @iffffffCOMPANY SWITCHESNy,@K @s^J8? @s^J8? y, @K@P V@7ڰcz@ɜ]jn3@NjN@2?@*j@MƧ@ǚ~=>N@u ZK@,ax@çf@*j@2?@ǵo,BNy,@K;@@둴š>5@2s^š>5y, @K @ҝZ@+M@̂-@Z@+M@`'``'`lJy,@K @+ s^@̂-@Z@+M@`Jy,@K @ҝZ@+M@`@Z@+M@ʂ-Jy,@K @ҝZ@+M@̂-@Ґ Q@`$@ y, @K @ҝZ@+M@}kr?@Z@+MwJ8? '`t'`ÀJy,@K @+ s^@}kr?@Z@+MwJ8? Jy,@K @ҝZ@+MuJ8? @Z@+MB}kr?Jy,@K @ҝZ@+M@}kr?@Ґ QwJ8? $@ !Ny,@K@ۭs^l @ۭs^d8إy, @K@}O+#@Ѻc)vW>$@}O+#?l1l@lr ě'`Ð @iffffffUPNy,@K-֥@=:jcf@MczNy,@K-֥@ OXu%@MczNy,@K-֥@bM4@MczNy,@K-֥@  C @MczNy,@K-֥@x65 Z@MczNy,@K-֥@˫1ri!+tW@MczNy,@K-֥@ˎWl [S @MczNy,@K-֥@qإH7@MczNy,@K-֥@S7> K'@MczNy,@K-֥@6nvLoߠ@MczNy,@K-֥@L*q@MczNy,@K-֥@ m+b[W@MczNy,@K-֥@Mj@MczNy,@K-֥@Kv2xԊ@MczNy,@K-֥@ʤAT@MczNy,@K-֥@ʆ8W#F@MczNy,@K-֥@i~@MczNy,@K-֥@Ly }CG@MczNy,@K-֥@/6h+b/@MczNy,@K-֥@rC{@MczNy,@K-֥@+EBԑ@MczNy,@K-֥@m?z?Ff@MczNy,@K-֥@ɺ+'j@[o̫֔@MczNy,@K-֥@ɜeL_@MczNy,@K-֥@3nqZ@MczNy,@K-֥@bcGPYW!@MczNy,@K-֥@E fMB7@MczNy,@K-֥@';)8H8}@MczNy,@K-֥@ ;)-߆@MczNy,@K-֥@Xԙ(#Uv@MczNy,@K-֥@ln ˎl@MczNy,@K-֥@Ȳҝ> C؜@MczNy,@K-֥@ȕ_B[@MczNy,@K-֥@xLf'|S/@MczNy,@K-֥@[ #9׎\N@MczNy,@K-֥@=ǀ¼2@MczNy,@K-֥@ >Ub= @ukDNy,@KԀu@ʑczfj$@MczNy,@K-֥@A|N/8Ub= @X'ⴕNy,@KqLʳ@ʑczV@MczNy,@K-֥@!ȧUb= @:@5z5Ny,@Kr@ʑcz}@MczNy,@K-֥@ȼ?>Ub= @ Ny,@K8إ@ʑcz+hqJ@MczNy,@K-֥@ǫy#Ub= @`<Ny,@K >d@ʑczAS]@MczNy,@K-֥@ǎ7+EUb= @i]Ny,@Kgn"@ʑczW>G@MczNy,@K-֥@phĵUb= @vBNy,@K(#@ʑczm#:G#@MczNy,@K-֥@S8!Ub= @ɨdaNy,@K4q@ʑczh(@MczNy,@K-֥@6n\ Ub= @ɋTqNy,@K>|u@ʑczT@MczNy,@K-֥@+3Ub= @nNy,@Kr yK@ʑcz@8@MczNy,@K-֥@ bUb= @Pυ}Ny,@KTgǂ @ʑczo@MczNy,@K-֥@ަ|/Ub= @3nNy,@KZC @ʑczڴ`$-@MczNy,@K-֥@cMUb= @IyRNy,@KjO@ʑcz @MczNy,@K-֥@Ƥ xtUb= @JNy,@K82vu@ʑcz82vu@MczNy,@K-֥@Ɔj{Ub= @DNy,@KufA@ʑczufA@MczNy,@K-֥@i;Ub= @ȾܵxNy,@K`Rf@ʑcz2`l o@MczNy,@K-֥@LXZUb= @ȡ>NNy,@K,Ks2'@ʑcz}@MczNy,@K-֥@/Ub= @ȃeWNy,@KB/ @ʑcz`^h@MczNy,@K-֥@Ҕr6Ub= @fC؝Ny,@KXy @ʑcz66@MczNy,@K-֥@^VUb= @IvXĽ4Ny,@KnJ@ʑcz @MczNy,@K-֥@MX1=Ub= @,3VNy,@Kxp@ʑcz?l;}@MczNy,@K-֥@ź Ub= @$kNy,@K"$@ʑczku)x@MczNy,@K-֥@ŜnDUb= @ԪNy,@K@ʑcz%t-@MczNy,@K-֥@F^Ub= @kNy,@KŬAVe@ʑczWw>@MczNy,@K-֥@bBUb= @Ƿ(u-Ny,@Kۖ`V@ʑcz\xq@MczNy,@K-֥@D|hUb= @ǙBNy,@Ke+@ʑcz|6eO@MczNy,@K-֥@''Ub= @|@fNy,@KmHQ@ʑczx D@MczNy,@K-֥@ z7ZUb= @_`UNy,@KX4 @ʑczt`$p"@MczNy,@K@&#@7IbJ=:@XtWNy,@K-֥@7Ub= @B֥Ny,@K3<4@ʑczq<"x@MczNy,@Kuw@Ni_T@ONy,@K-֥@+0/sUb= @$ڙJNy,@KI(i@ʑczk)@+M@MczNy,@K`@@+MXĽ4@FD^Ny,@K-֥@IJUb= @!Ny,@K_i@ʑczcؙv@MczNy,@K7F(@"WB>@=u`Ny,@K-֥@ĕnbRUb= @UTNy,@KV@ʑczYދ;2@MczNy,@Kl@֥\OI@4PRfNy,@K-֥@x,TXFUb= @ONy,@K.;@ʑczD"Ӳ@MczNy,@K)F@ fM4D^Ԣ@++mNy,@K-֥@Z+Ub= @Ư FNy,@KA@ʑcz@0~6@MczNy,@K^Ka@B} ׇΕ@"z-Ny,@K-֥@=OОUb= @ƒ,Ny,@Kmq٘@ʑcz@Rtꍧ@MczNy,@K @di @>p~Ny,@K-֥@ cl5Ub= @uJNy,@KHE/@ʑcz@``x@MczNy,@Kk̎@·J#`/@z9Ny,@K-֥@!@NUb= @Xy Ny,@K+k@ʑcz@h z&@MczNy,@KIz@V o$shh@Ny,@K-֥@p3;Ub= @:'Ny,@K/e@ʑcz@o\.<@MczNy,@K'}dQ0@(axj'V@rˉNy,@K-֥@țBUb= @4~9Ny,@KRiY`@ʑcz@sVleW@MczNy,@K'}dQ0@0B{k)@N-Ny,@K-֥@ëXlTUb= @>һ#WNy,@KH)=,@ʑcz@vأ/D@MczNy,@K'}dQ0@䢖nToπ3@)i]Ny,@K-֥@Î(V`Ub= @0<Ny,@K| NL@ʑcz@z,@MczNy,@K'}dQ0@_v4@&Ny,@K-֥@p'VUb= @Ź^Ny,@Ky@`|A@ʑcz@~O8@MczNy,@K!b @ZԀuV`^@؜Ny,@K-֥@S*Ub= @ŨvNy,@Ku,Ӫ6@ʑcz@DAxp@MczNy,@K@@$ku@ϺTNy,@K-֥@6MUb= @ŋ4YddNy,@Kq'@ʑcz@v@MczNy,@K~vB@l y@ƕm+Ny,@K-֥@ XRmUb= @mNy,@Kl܋@ʑcz@J@MczNy,@KSq@m43LQEAvS@½p6Ny,@K-֥@>Ub= @PTNy,@Ke>-4B@ʑcz@xt-F$@MczNy,@K}@W;) ^@´LNy,@K-֥@ޅL'JUb= @3k%Ny,@K[ QX@ʑcz@LU@MczNy,@K9JM+,@Bp+^b@«';Ny,@K-֥@B Ub= @)rGNy,@KJsx$˟@ʑcz@ }F@MczNy,@K(Eg@1z9$[)@¢wNy,@K-֥@¤xUb= @u Ny,@K@y<%@ʑcz@ yK@MczNy,@KFvB@!m+Ub= @ۣ۠&Ny,@K@P F#п@ʑcz@)Ie@MczNy,@Kv@J#-Ub= @ľ`i Ny,@K@^:@ʑcz@Rk΅@MczNy,@Kg@,Ub= @ġzNy,@K@f<+@ʑcz@G@MczNy,@KLX7@JfVUb= @ă4sNy,@K@m܏o@ʑcz@PH@MczNy,@K1 b@x,'Ub= @fC1Ny,@K@rԮB@ʑcz@oV@MczNy,@K'.jv@&OUb= @IUܠNy,@K@vKaM@ʑcz@v@@MczNy,@KZ>9r@KaFUb= @,UvNy,@K@ybK@ʑcz@aPX@MczNy,@KTGp?-@O#}Ub= @JfUNy,@K@}F@ʑcz@K-dQ0@MczNy,@K֥@KF귙_Ub= @HJNy,@K@kif@ʑcz@5BxJy@MczNy,@Ko֥@MH8}Ub= @J\Ny,@K@v߃@ʑcz@WI@MczNy,@K֥@PA eUb= @÷ Ny,@K@JػMH@ʑcz@ l~@MczNy,@K~a/ @O6mzWUb= @ÙqbcNy,@K@"@ʑcz@m{R@MczNy,@K b= @NRUb= @|RNy,@K@96@ʑcz@ݜ V@MczNy,@KV:q@QczUb= @_?e47?Ny,@K@c*c@ʑcz@DZ1@MczNy,@KǕp?-@P;Ub= @AЯNy,@K@@ʑcz@ffff@MczNy,@Kzȣr`@PUb= @$0jNy,@K@oo5@ʑcz@7ɚ@MczNy,@KOb= @H\NUb= @w\NNy,@K@Cc@ʑcz@Kv2@MczNy,@KДb= @Kt/%Ub= @43LNy,@K@ @ʑcz@p @MczNy,@KO"UK@NUb= @jNy,@K@v N@ʑcz@Z o&(@MczNy,@KqJ@NUb= @¯)Ny,@K@`5@ʑcz@"D@MczNy,@KǕp?-@?x$Ub= @’lDNy,@K@JJT8T@ʑcz@%K@MczNy,@K"Kv2@AڰczUb= @u);Ny,@K@4_h{@ʑcz@ /=@MczNy,@K@z{q@ʑcz@=]=ȸ@MczNy,@K@@ʑcz@G:6]@MczNy,@K@]Av@ʑcz@kROО@MczNy,@K@ܹ|@ʑcz@\j@MczNy,@K@΅3@ʑcz@UgB؄@MczNy,@K@V@ʑcz@q̖F(@MczNy,@K@- $@ʑcz@?TK@MczNy,@K_'B؄@\Vle6@a:>//Ny,@K@>@ʑcz@HS@MczNy,@K8إ@ q7@s^Ny,@K@o(s*@ʑcz@)F@MczNy,@K wN&@E*%Ib= @.'[Ny,@K@Y=Nr@ʑcz@'9@MczNy,@K_|@ /'ԉq@.'[Ny,@K@CR)@ʑcz@9z@MczNy,@KIdo@5`A7%zȣr`@4Ny,@K@-mP@ʑcz@e@MczNy,@K3w@:*+̔b= @ mNy,@K@ ln @ʑcz@KY@MczNy,@K^@eB-s֥@x1jNy,@K@VJ@ʑcz@rۭ@MczNy,@K@_Ru@ʑcz@_Ru@MczNy,@K@j0@ʑcz@\0@MczNy,@K@R}@ʑcz@0q@MczNy,@K@Tٵ[@ʑcz@F@MczNy,@K@*c@ʑcz@cW@MczNy,@K@? Ĥ@ʑcz@1 cA@MczNy,@K@V`^@ʑcz@w2H@MczNy,@K@)"'@ʑcz@"\̊@MczNy,@K@0] t@ʑcz@0] t@MczNy,@K@:@ʑcz@:@MczNy,@K@EZ?@ʑcz@zE| Y@MczNy,@K@P@ʑcz@O伭@MczNy,@K@rZn?@ʑcz@dZn?@MczNy,@K@hZ)@ʑcz@gn@MczNy,@K@\rjj@ʑcz@Nrjj@MczNy,@K@} gb@ʑcz@} gb@MczNy,@K@FsP@ʑcz@8sP@MczNy,@K@NUb= @b>Ny,@K@i@ʑcz@>k@1 Ny,@KU@NUb= @N bNy,@K@0e6@ʑcz@>k@v'Ny,@K@C @ʑcz@>k@KNy,@K@ð@ʑcz@>k@qJNy,@K@uK@ʑcz@>k@˼$Ny,@K* @ n4Vm@S&Ny,@K@j&G@ʑcz@>k@˟4/QNy,@K]6{7@6(Ƣ.w@\Ny,@K@y#R@ʑcz@>k@˂@Ny,@K@#@ʑcz@>k@dLXNy,@K@c,@ʑcz@>k@G Ny,@K@m@ʑcz@>k@*w7 Ny,@K@N_@ʑcz@>k@ 5QaNy,@K@ @ʑcz@>k@4Ny,@K@81;@ʑcz@>k@ҰNy,@K@#|N/@ʑcz@>k@ʵmz3Ny,@K@".-p@ʑcz@>k@ʘ*I#_y, @K@-=@ǝtIz@5Gi@3 '` '`4Ny,@K@5Gi@BS;@!@GAFNy,@K@5Gi@%Q~+V@{f~@GAFNy,@K@5Gi@۔@/@GAFNy,@K@5Gi@Ag\@i q@GAFNy,@K@5Gi@͉;B@ e@GAFNy,@K@5Gi@˰G'c@ސYdd@GAFNy,@K@5Gi@˓b= @->@GAFNy,@K@5Gi@uO@Sb= @GAFNy,@K@5Gi@X~f#J@!@GAFNy,@K@5Gi@;;QzF@Ȧ9y@GAFNy,@K@5Gi@!%@, F@GAFNy,@K@5Gi@%@=l@GAFNy,@K@5Gi@se@x8:@GAFNy,@K@5Gi@0z9@nij'@GAFNy,@K@5Gi@ʨ q@B7G@GAFNy,@K@.N&Ԁ@ʗtIz@'h@GAFNy,@K@@ʗtIz@bM,@GAFNy,@K@=:V@ʗtIz@Z@GAFNy,@K@wX6@ʗtIz@Y5@GAFNy,@K@DV @ʗtIz@i^@GAFNy,@K@T@ʗtIz@Lct@GAFNy,@K@'OI@ʗtIz@Gb@GAFNy,@K@a.R"@ʗtIz@oǂ @GAFNy,@K@[c,C@ʗtIz@ O+@GAFNy,@K@c@ʗtIz@6z1@GAFNy,@K@eݹ@ʗtIz@pv@GAFNy,@K@K!Z@ʗtIz@u@GAFNy,@K@q\@ʗtIz@ @GAFNy,@K@@ʗtIz@ 7@GAFNy,@K@|^@ʗtIz@[LX@GAFNy,@K@6J@ʗtIz@,zx@GAFNy,@K@p @ʗtIz@ I@GAFNy,@K@ N@ʗtIz@ @GAFNy,@K@G@ʗtIz@E,z|@GAFNy,@K@ %;@ʗtIz@zԲ@GAFNy,@K@Zjq@ʗtIz@7y @GAFNy,@K@"8? @ʗtIz@8إ@GAFNy,@K@ϧӑ ,@ʗtIz@/Am*@GAFNy,@K@ .S@ʗtIz@iA;@GAFNy,@K@Dbs@ʗtIz@M @GAFNy,@K@9!h/@ʗtIz@˧2@GAFNy,@K@w @ʗtIz@X@GAFNy,@K@Cd8@ʗtIz@S4X @GAFNy,@K@.߽jY@ʗtIz@byW@GAFNy,@K@iO=@ʗtIz@M#h@GAFNy,@K@;@ʗtIz@n/@GAFNy,@K@N5@@̪$ @3 Ny,@K@Z-@ʗtIz@=󶈽@GAFNy,@K@N5@M#h@֕]=ȸ@܈GNy,@K@aZ@ʗtIz@xy ,^-@GAFNy,@K@N5@R@*@&01Ny,@K@Sd둴@ʗtIz@@+M@GAFNy,@K@N5@͸+n@kvd@-vNy,@K@{k)@ʗtIz@J@GAFNy,@K@N5@͚n@VU@Q̼Ny,@K@p~J@ʗtIz@( Z@GAFNy,@K@N5@} +#@B-@ͱ~pNy,@K@µ@ʗtIz@b\N@GAFNy,@K@N5@`GaZ@-eәp@͞&oNy,@K@={)<@ʗtIz@µ@GAFNy,@K@N5@CQ@@͊K/;Ny,@K@xn@ʗtIz@ךR@GAFNy,@K@N5@%-@ŬG@wwNy,@K@@ʗtIz@ XĽ@GAFNy,@K@N5@h'1@%@d vNy,@K@ v@ʗtIz@&SF@GAFNy,@K@N5@< b@/R@P oz Ny,@K@'Kr@ʗtIz@C;@GAFNy,@K@N5@ @96*^x@=q/jQNy,@K@bI@ʗtIz@`D@GAFNy,@K@N5@̰|}@CfN@*7ZNy,@K@5Gi@ʗtIz@~p@GAFNy,@K@N5@̓tIz@IN5@tIzNy,@K@!i@ʗtIz@]#@GAFNy,@K@N5@v1~^@IN5@1~^Ny,@K@N6@ʗtIz@3L@GAFNy,@K@N5@X Q@IN5@ QNy,@K@L-@ʗtIz@IN5@̺d8Ny,@K@w@ʗtIz@IN5@̝iNy,@K@7v@ʗtIz@IN5@̀&ffffNy,@K@At>@ʗtIz@IN5@b9Ny,@K@6Bu @ʗtIz@IN5@E!h/Ny,@K@pJM+,@ʗtIz@IN5@(]zԲNy,@K@N~L@ʗtIz@IN5@ %Nn"Ny,@K@ä/@ʗtIz@IN5@؂RNy,@K@,{~ @ʗtIz@IN5@ЕP7PNy,@K@-o}@ʗtIz@IN5@˳SF#пNy,@K@Jjk@ʗtIz@IN5@˖j/Ny,@K@g+<Ĭ@ʗtIz@IN5@xAZuNy,@K@7i+=@ʗtIz@IN5@[8? Ny,@K@z_@ʗtIz@IN5@>G#Ny,@K@]@ʗtIz@IN5@!bNy,@K@lT@ʗtIz@IN5@`VNy,@K@g=@ʍa@IN5@U͑Ny,@K@g=@pVU:@IN5@<+^Ny,@K@g=@S^g@IN5@ʫ!tNy,@K@g=@5B@IN5@ʎH^=Ny,@K@g=@~bn@IN5@qtvNy,@K@g=@K@IN5@T2BJ'kNy,@K@g=@qJ@IN5@6 Ny,@K@g=@wJ@IN5@5HNy,@K@g=@ɣ=J*@IN5@i^Ny,@K@g=@Ɇ@y@IN5@'2/'Ny,@K@g=@hLX@IN5@^Ny,@K@g=@K_Rv@IN5@ɤsNy,@K@g=@.w덂4@IN5@ɇ^ZFsNy,@K@g=@5Qa@IN5@jǂ Ny,@K@g=@4@IN5@LzNy,@K@g=@ְN@IN5@/{Ny,@K@g=@ȹmr6~A@IN5@SNy,@K@g=@Ȝ*I#_@IN5@vNy,@K@g=@~m@IN5@܃#5Ny,@K@g=@aӝf@IN5@Ⱥ1RNy,@K@g=@Db1@IN5@ȝHcNy,@K@g=@'m@IN5@ȀXNy,@K@g=@ ,@IN5@bŠ@Ny,@K@g=@왒"@IN5@EZNy,@K@g=@V@IN5@(=VlNy,@K@g=@DzMrP@IN5@ @Ny,@K@ J#@ǝtIz@IN5@nMNy,@K@M @ǝtIz@\'Nw@MNy,@K@3OLnm@ǝtIz@yi@MNy,@K@Pˉ@ǝtIz@e#p@MNy,@K@nJ@@ǝtIz@->@MNy,@K@X.w @ǝtIz@1j@MNy,@K@df@ǝtIz@u2P$@MNy,@K@;66@ǝtIz@ }@MNy,@K@ b@ǝtIz@(n7@MNy,@K@co@ǝtIz@-=@YJNy,@K@ j@ǝtIz@-=@ǭ,d$@ Ny,@K;@up@Jm@ @JmNy,@K8@ 3@ um5F Ny,@K8@];$o@D`x$o Ny,@K8@D`x$o@D`x,Mf Ny,@K8@D`x3@ 3 Ny,@K8@ @Jm@ @) V Ny,@K8@ 5qy@Թ@+M5qy Ny,@K8@ t^h@Թ@+Mt^h Ny,@K8@Թ@+Mr@hz@Թ@+M5qy Ny,@K8@ Q#螘@s^#螘 Ny,@K8@s^9 >d@s^4i Ny,@K8@s^G@B-DܩG Ny,@K8@B-Dܩ8إ@B-DܩļXR Ny,@K8@B-Dܩl@B-DܩG Ny,@K8@B-Dܩ9zԲ@C9zԲ Ny,@K8@C8إ@C9zԲ Ny,@K8@B-Dܩ_8@C_8 Ny,@K8@CN2@CļXR Ny,@K8@B-DܩhF#п@B-Dܩ>5 Ny,@K8@B-Dܩ8إ@C8إ Ny,@K8@B-DܩļXR@CļXR Ny,@K;@r5@Jm@r5@tIzy, @K@Թ@+M3Gb@eg=@DV'`ʤ'`ҘNy,@K@eg=@Ԁu@n:@FNy,@K@eg=@Ɍ2 @Ƌܙ̣@FNy,@K@eg=@ǬIԝ{@Ʃ3333@FNy,@K@m{oK6@Ǘcz@a_@FNy,@K@Ɗ xN@Ǘcz@o޵,@FNy,@K@ƨs^@Ǘcz@@FNy,@K@PZp@?t/%@Y@+M@H}0GNy,@K@D7y@Ǘcz@*tK+w@FNy,@K@PZp@"1#@wF@H}0GNy,@K@p@̸#@r5@DVNy,@K@↰cz@Ǘcz@;mw@FNy,@K@PZp@p@ǔS}0G@H}0GNy,@K@p@̛p@r5@'b4Ny,@K@JG @Ǘcz@ǖ4 V@- Ny,@K@p@~lMDVq@r5@ x$Ny,@K@ bs@Ǘcz@ǖ4 V@CD^ԢNy,@K@p@a);@r5@n;Ny,@K@:OWOr.@Ǘcz@ǖ4 V@߹8Ny,@K@p@CF@r5@Ϛ;yRNy,@K@W{ؾ@Ǘcz@ǰx`4@FNy,@K@p@&XĽ@r5@̲V9CNy,@K@tԓ'@Ǘcz@ͺaZ@FNy,@K@p@ `{@r5@̕7 ܇Ny,@K@ǒ.'Z@Ǘcz@@FNy,@K@p@aZ@r5@wќuNy,@K@ǯYЦv!@Ǘcz@@7 ܇@FNy,@K@p@.'[@r5@ZaZNy,@K@̜s%@Ǘcz@%ً@FNy,@K@p@˱-@|ً@GAFNy,@K@l@Ǘcz@B;yR@FNy,@K@p@˔Un7@̚;yR@GAFNy,@K@"o?R@Ǘcz@`n;@FNy,@K@p@w B@̷Hեb@GAFNy,@K@$e#>@Ǘcz@}Kx$@FNy,@K@p@YІ/@ԋw@GAFNy,@K@A=@Ǘcz@Ț5@FNy,@K@p@<@4@GAFNy,@K@^Ni^@Ǘcz@ȷдV@FNy,@K@p@KAD@V@GAFNy,@K@|-@Ǘcz@f@FNy,@K@p@둴@,T'cX@GAFNy,@K@șp[)@Ǘcz@V<@FNy,@K@p@<@I@GAFNy,@K@ȶU@Ǘcz@dR@FNy,@K@p@ǂi@f[y@GAFNy,@K@ԝ{@Ǘcz@,;@FNy,@K@p@ʪ@@̈́;@GAFNy,@K@8:S@Ǘcz@Jgjr@FNy,@K@p@ʌ]@͡^K@GAFNy,@K@zԀu@Ǘcz@ga2@FNy,@K@p@oT~@;:@GAFNy,@K@+>//@Ǘcz@Ʉ&@FNy,@K@p@Rwag#%@&@GAFNy,@K@I@Ǘcz@ɡ?R&@FNy,@K@p@54R@'?R&@GAFNy,@K@fC{k)@Ǘcz@ɿ)b@FNy,@K@p@hR@i@GAFNy,@K@Ƀ@Ǘcz@lQ2@FNy,@K@p@<@3{~ @GAFNy,@K@ɠȸ3"@Ǘcz@}@FNy,@K@p@l2@r5@i Ny,@K@̎|K@ʄg}0G@P}@GAFNy,@K@ɾ @Ǘcz@򈽩C@FNy,@K@p@*=>N@r5@Kx6Ny,@K@̫X$@ʄg}0G@n2jj@GAFNy,@K@N^F@Ǘcz@45"@FNy,@K@p@ɢP@r5@.1riNy,@K@țPv:@ʄg}0G@΋u+<Ĭ@GAFNy,@K@_@Ǘcz@Qwi+=@FNy,@K@p@Ʌ8إ@r5@Wl Ny,@K@#|@ʄg}0G@Ψi+=@GAFNy,@K@/+g@Ǘcz@n_@FNy,@K@p@haR<@r5@إHNy,@K@ N @ʄg}0G@_@GAFNy,@K@3[@Ǘcz@ʋ6@FNy,@K@p@K&V@r5@7>Ny,@K@ ch{@ʄg}0G@<]@GAFNy,@K@PZV@Ǘcz@ʩ@d@FNy,@K@p@-a@r5@ɹnvNy,@K@=һ#W@ʄg}0G@lT@GAFNy,@K@m@Ǘcz@ƃ#@FNy,@K@p@a@r5@ɜL*Ny,@K@Zl@ʄg}0G@#@GAFNy,@K@ʊ:G#@Ǘcz@ũ>@FNy,@K@p@VU:@r5@ m+Ny,@K@x,fP@ʄg}0G@;@GAFNy,@K@ʨ!@Ǘcz@C,z@FNy,@K@p@^g@r5@aNy,@K@͕n @ʄg}0G@XHKZS@GAFNy,@K@dEZ}@Ǘcz@JY @FNy,@K@p@ȸB@r5@DKv2Ny,@K@ͲL'J@ʄg}0G@u@GAFNy,@K@q @Ǘcz@;*L@FNy,@K@p@ț~bn@r5@'ANy,@K@>@ʄg}0G@ϒ't@GAFNy,@K@ꃱ@Ǘcz@X7.@FNy,@K@p@~K@&p@ȽNy,@K@CKja@Iz@r5@ 8Ny,@K@7P~@ʄg}0G@ϰ7.@GAFNy,@K@-&01@Ǘcz@vD@FNy,@K@p@aqJ@&p@ȠqJNy,@K@aʅ@Iz@r5@커~Ny,@K@ y@ʄg}0G@SR@GAFNy,@K@:o]R@Ǘcz@˓V/n@FNy,@K@p@CwJ@&p@ȃEwJNy,@K@'*@ʄg}0G@&ù(@GAFNy,@K@Wbn*@Ǘcz@˰Bԑ@FNy,@K@p@&=J*@&p@f4/QNy,@K@D'V@ʄg}0G@djH@GAFNy,@K@tԻ@Ǘcz@&p@HNy,@K@bAա@ʄg}0G@@GAFNy,@K@˒8gHu@Ǘcz@&p@+}LXNy,@K@4B@ʄg}0G@!/fץn@GAFNy,@K@˯{ @Ǘcz@&p@: Ny,@K@ΜB@ʄg}0G@/и3"@GAFNy,@K@̽fo@Ǘcz@&p@7 Ny,@K@κ y@ʄg}0G@>r-fj@GAFNy,@K@M@N@ʄg}0G@MRC@GAFNy,@K@l5@ʄg}0G@['g@GAFNy,@K@G@ʄg}0G@jUµ@GAFNy,@K@/+X@ʄg}0G@xb@GAFNy,@K@LXTXF@ʄg}0G@Ї"J@GAFNy,@K@iy@ʄg}0G@Ж:H8}@GAFNy,@K@φݑ@ʄg}0G@ФەN>@GAFNy,@K@Ϥ 3K@ʄg}0G@г|d@GAFNy,@K@c@ʄg}0G@F@GAFNy,@K@ަ7Z@ʄg}0G@пz@GAFNy,@K@&@ʄg}0G@a5ڭ`@GAFNy,@K@ MnH@ʄg}0G@;@GAFNy,@K@7 @ʄg}0G@Y@GAFNy,@K@)X/D@ʄg}0G@ E%o@GAFNy,@K@8z ܵ@ʄg}0G@ڐ@GAFNy,@K@G_@ʄg}0G@('77@GAFNy,@K@U@ʄg}0G@7)x@GAFNy,@K@d]/+g@ʄg}0G@E%R@GAFNy,@K@rFE^@ʄg}0G@Tl;@GAFNy,@K@Ё@ʄg}0G@c 23Y@GAFNy,@K@АBLA@ʄg}0G@qz@GAFNy,@K@О@ʄg}0G@рPjN@GAFNy,@K@Э$@ʄg}0G@юǂ @GAFNy,@K@м&<:B@ʄg}0G@ѝݵR@GAFNy,@K@ZJ@ʄg}0G@Ѭ4'@GAFNy,@K@i>p~@ʄg}0G@Ѻ =J@GAFNy,@K@ @ʄg}0G@w\|ؙ@GAFNy,@K@?@ʄg}0G@fM@GAFNy,@K@M.@ʄg}0G@ҙ@GAFNy,@K@{@ʄg}0G@[G@GAFNy,@K@"4ebZ@ʄg}0G@Ի@GAFNy,@K@11{@ʄg}0G@NHbo@GAFNy,@K@?Α@ʄg}0G@!?^@GAFNy,@K@Nt3@ʄg}0G@/#l@GAFNy,@K@]qT@ʄg}0G@>9V@GAFNy,@K@k"@ʄg}0G@M#@GAFNy,@K@zXo @ʄg}0G@[@F@GAFNy,@K@шĆ.@ʄg}0G@jf*@GAFNy,@K@їv@ʄg}0G@y@R@GAFNy,@K@Ѧ<^@ʄg}0G@҇/:@GAFNy,@K@Ѵݯs@ʄg}0G@ҖJ|n?@GAFNy,@K@eP@ʄg}0G@Ҥ-@GAFNy,@K@ (ܘ@ʄg}0G@ҳ@GAFNy,@K@hjM@ʄg}0G@.57@GAFNy,@K@cP~@ʄg}0G@Kja@GAFNy,@K@+I@ʄg}0G@qja@GAFNy,@K@ V3&@ʄg}0G@#@GAFNy,@K@Gfo@ʄg}0G@p3;@GAFNy,@K@) @ʄg}0G@ U@GAFNy,@K@8Fs@ʄg}0G@8@GAFNy,@K@G+ @ʄg}0G@(`V@GAFNy,@K@Uh@ʄg}0G@79l5@GAFNy,@K@dnJ@ʄg}0G@Eb@GAFNy,@K@s}@ʄg}0G@T|Z@GAFNy,@K@ҁ4B@ʄg}0G@c~@GAFNy,@K@ҐR+@ʄg}0G@qR" @GAFNy,@K@Ҟ̫֔@ʄg}0G@Ӏ`8? @GAFNy,@K@ҭz@ʄg}0G@ӏXU@GAFNy,@K@Ҽ6@ʄg}0G@ӝԝ@GAFNy,@K@%;@ʄg}0G@ӬD@GAFNy,@K@yw @ʄg}0G@Ӻ?;.@GAFNy,@K@6@ʄg}0G@ɇ-#O@GAFNy,@K@@둴@ʃpmq@)F#п@GAFNy,@K@@둴@f-5ڭ`@ʓ:@GAFNy,@K@@둴@HꛮF@ky@GAFNy,@K@@둴@+?@ 5q@GAFNy,@K@@둴@eV@R@GAFNy,@K@@둴@"m@ @F +<ĬNy,@K@@둴@"WB@ @(ƀjjNy,@K@@둴@ɶ3"@ @ }Ny,@K@@둴@əZ@ @@Q2Ny,@K@@둴@|{k)@ @bNy,@K@@둴@^@ @˳?R&Ny,@K@@둴@A>//@ @˖x&Ny,@K@@둴@$NԀu@ @y5:Ny,@K@@둴@ 2 @ @[gjrNy,@K@@둴@ɗԝ{@ @>;Ny,@K@@둴@̆6@ @!m[yNy,@K@@둴@ȯD[)@ @*Ny,@K@@둴@Ȓ@ @fNy,@K@@둴@tV7@ @ɤVNy,@K@@둴@W{@ @ʬb5Ny,@K@@둴@:9ne@ @ʏwNy,@K@@둴@w@ @qn;Ny,@K@@둴@eD@ @T;yRNy,@K@@둴@pjܱ@ @7VًNy,@K@@둴@-Цv!@ @.'Ny,@K@@둴@ǧ6z@ @єNy,@K@@둴@NJ'@ @ߎaZNy,@K@@둴@me{ؾ@ @L`4Ny,@K@@둴@P";@ @ɥ/jNy,@K@@둴@2bs@ @ɇSuNy,@K@@둴@R@ @jIbINy,@K@@둴@Zcz@ @MAFNy,@K@@둴@ @ @/tK+wNy,@K@@둴@ƽs^@ @Ny,@K@@둴@Ơ@ @xo޵,Ny,@K@@둴@ƃOf3]@ @5ղNNy,@K@@둴@f @ @Ⱥ3333Ny,@K@@둴@H2f<@ @ȝNy,@K@@둴@+Ε@ @Ȁm:Ny,@K@@둴@D%;@ @c*VXNy,@K@@둴@Ԉ@ @EȆNy,@K@@둴@Ӿ5@ @(ONy,@K@@둴@Ŷ|F@ @ boNy,@K@@둴@ř97&@ @ CReNy,@K@@둴@{]Ж@ @pq#Ny,@K@@둴@^@ @dz'ANy,@K@@둴@Aqr@ @ǖWl Ny,@K@@둴@$.c @ @yɅoNy,@K@@둴@#y@ @[/YNy,@K@@둴@.Ƽ@ @>-#ONy,@K@@둴@e3U@ @!L*Ny,@K@@둴@į#"@ @ m+Ny,@K@@둴@đ+4@ @ANy,@K@@둴@tĤ@ @ɄKv2Ny,@K@@둴@W[Bb@ @ƬANy,@K@@둴@:@ @Ǝ8Ny,@K@@둴@>p~@ @q~Ny,@K@@둴@b@ @Ty }Ny,@K@@둴@P@ @76p~]Ny,@K@@둴@ g@ @ŬGNy,@K@@둴@çz$@ @+Ny,@K@@둴@ÊZjj@ @mɒNy,@K@@둴@mD@ @+gNy,@K@@둴@P-p@ @Ť脔NNy,@K@@둴@2@ @ŇgGNy,@K@@둴@|fw@ @jcP;Ny,@K@@둴@:GU@ @M itNy,@K@@둴@,@ @/C|VNy,@K@7둴@@B鉜@BH8}@V}0GNy,@K@@둴@½B鉜@ @;)Ny,@K@7둴@#qZ@Q{N>@V}0GNy,@K@@둴@ qZ@ @XԙNy,@K@7둴@.R@`d@V}0GNy,@K@@둴@ƒ.R@ @dQ0Ny,@K@7둴@c9@nF@V}0GNy,@K@@둴@ec9@ @ĺ%RNy,@K@7둴@˨,'@}_z@V}0GNy,@K@@둴@H,'@ @ĝ_BNy,@K@7둴@fV@Ҍ5ڭ`@V}0GNy,@K@@둴@+fV@ @ĀLŸUNy,@K@7둴@#Z@Қ;@V}0GNy,@K@@둴@#Z@ @c #9Ny,@K@7둴@s"@ҩCY@V}0GNy,@K@@둴@"@ @EǀNy,@K@7둴@Vw#@ҷ%o@V}0GNy,@K@@둴@Ӟw#@ @(>Ny,@K@7둴@9[@Ɔڐ@V}0GNy,@K@@둴@[@ @ Asz_Ny,@K@7둴@shh@('77@V}0GNy,@K@@둴@shh@ @Ny,@K@7둴@x@x@V}0GNy,@K@@둴@{Ny,@K@7둴@&mzV@j%R@V}0GNy,@K@@둴@^6+o@ @óyvFNy,@K@7둴@9!@ @Ö6vlNy,@K@7둴@N#R@ @x`xNy,@K@7둴@0H(@ @[Ny,@K@7둴@JfU@ @>n\ Ny,@K@7둴@L/@ @!+~(Ny,@K@7둴@dqbc@ @`Ny,@K@>Ai@C-@ @|/Ny,@K@L @C-@ @cMNy,@K@[)Ie@C-@ @¬ xtNy,@K@j%v_خ@C-@ @Žj{Ny,@K@xǟfb@C-@ @q;Ny,@K@҇h@C-@ @TXZNy,@K@Җ @C-@ @7Ny,@K@Ҥ/<@C-@ @Ҕr6Ny,@K@ҳLh+b@C-@ @ Ny,@K@A@C-@ @MO;dNy,@K@Џ }@C-@ @ Ny,@K@0+^@C-@ @nDNy,@K@^@C-@ @F^Ny,@K@@둴@*Ps@ @jBC Ny,@K@@둴@2hR@ @LtܐNy,@K@@둴@2@ @/nuNy,@K@@둴@{'`@ @z7ZNy,@K@@둴@@^@ @7p?-Ny,@K@@둴@8@ @+0/sNy,@K@@둴@˖e.@ @Ny,@K@@둴@<&@ @nbRNy,@K@@둴@V@ @,TXFNy,@K@@둴@@ @b+Ny,@K@@둴@ej@ @EOОNy,@K@@둴@ @ @(cjNy,@K@@둴@luY|@ @ ! Ny,@K@@둴@1@ @ۼfwNy,@K@@둴@jϷb@ @7)VNy,@K@@둴@ ܭ@ @f0Ny,@K@@둴@^vB@ @,+CNy,@K@@둴@Gْ"@ @_RuNy,@K@@둴@ TMrO@ @!T?Ny,@K@@둴@./@ @|VJNy,@K@@둴@I0n]@ @B;)Ny,@K@@둴@]U@ @}Ny,@K@@둴@#=@ @ $NNy,@K@@둴@踆YJ@ @S&Ny,@K@@둴@3R}@ @XJNy,@K@@둴@s@ @zNy,@K@@둴@9'8'@ @^ Ny,@K@@둴@)Zl@ @nPNy,@K@@둴@ЍL@ @mgNy,@K@@둴@z,@ @3dW#FNy,@K@@둴@OE@ @#FV%Ny,@K@@둴@{R@ @Y͢Ny,@K@@둴@<3@ @ Ny,@K@@둴@?@ @IMo2Ny,@K@@둴@dä/@ @˒:Ny,@K@@둴@*v~M@ @CKrNy,@K@@둴@JM+,@ @Ny,@K@@둴@ju @ @_7B؄Ny,@K@@둴@z0@ @$Ny,@K@@둴@@_v@ @,BԑNy,@K@@둴@:@ @DNy,@K@@둴@U@ @u"OОNy,@K@@둴@> @ @: Ny,@K@@둴@VIzF;@ @6mzWNy,@K@@둴@$v@ @ő6Ny,@K@@둴@>I@ @ ͻNy,@K@@둴@v@ @PCNy,@K@@둴@l4V@ @CrqNy,@K@@둴@1r/@ @z伭Ny,@K@@둴@(n@ @*A*Ny,@K@@둴@9@ @foO Ny,@K@@둴@µ@ @+Ny,@K@@둴@G~J@ @e6Ny,@K@@둴@ D^@ @ި+Ny,@K@@둴@Ҍ둴@ @|Ys^Ny,@K@@둴@rē@ @A?_`Ny,@K@@둴@]-@ @NaZNy,@K@@둴@"V@ @ɵc#Ny,@K@@둴@w=@ @D VNy,@K@@둴@b @ @W7&Ny,@K@@둴@sk3@ @8x1jNy,@K@@둴@8ffff@ @3333Ny,@K@@둴@d2@ @-4aNy,@K@@둴@@ @m/@Ny,@K@@둴@1@ @3!y}Ny,@K@@둴@l@ @]Ny,@K@@둴@(>p~@ @l Ny,@K@@둴@ts@ @7>Ny,@K@@둴@>Kv2@ @I SqNy,@K@@둴@u@ @Ny,@K@@둴@Th:@ @PNy,@K@@둴@]/b@ @{~Ny,@K@@둴@jS&@ @^_حNy,@K@@둴@Hf'|@ @$q+Ny,@K@@둴@>T;@ @'jNy,@K@@둴@ 0iz@ @e"Ny,@K@@둴@&!@ @tݨ#Ny,@K@@둴@!Fk@ @:ZONy,@K@@둴@PT*@ @dQ0Ny,@K@@둴@7 k"@ @P/Ny,@K@@둴@<[@ @=Ny,@K@@둴@L[@ @PDzNy,@K@@둴@ _$S@ @!ȨNy,@K@@둴@b٠@ @s[Ny,@K@@둴@7@ @AhJNy,@K@@둴@xĭ,@ @^GNy,@K@@둴@CA@ @WP>Ny,@K@@둴@M@ @Fo7Ny,@K@@둴@Q;\@ @m;Ny,@K@@둴@@ @1C9:Ny,@K@@둴@/3v@ @&ڇsNy,@K@@둴@5@ @/@_kNy,@K@@둴@Eu ZK@ @Ny,@K@@둴@j? @ @$@Ny,@K@@둴@[_@ @Ny,@K@@둴@UF@ @9*~ZNy,@K@@둴@qK(J@ @.Ny,@K@@둴@zpe@ @O./Ny,@K@@둴@e1;@ @̰} Ny,@K@@둴@$Q_@ @e&INy,@K@@둴@:Ny,@K@@둴@A4)<@ @t3TNy,@K@@둴@Wc@ @&hNy,@K@@둴@mä/@ @{k)Ny,@K@@둴@8@ @oCNy,@K@@둴@17d@ @CNy,@K@@둴@]@ @* Ny,@K@@둴@_@ @k,BNy,@K@@둴@)M#h@ @Ny,@K@@둴@%l@ @dNy,@K@@둴@ Ճ@ @-VNy,@K@@둴@8X@ @ÈNy,@K@@둴@df;@ @tfPNy,@K@@둴@} ($@ @Xf'|Ny,@K@@둴@yxAd@ @CmL4Ny,@K@@둴@u[@ @. Ny,@K@@둴@r'Mο@ @1.Ny,@K@@둴@l֥@ @GNy,@K@@둴@e\O@ @\޵,Ny,@K@@둴@\r%@ @rԌNy,@K@@둴@L1V}@ @QzFNy,@K@@둴(kY@ @ENy,@K@@둴NS @ @j{Ny,@K@@둴]"Ӳ@ @ʀ2Ny,@K@@둴f6n@ @e#pGNy,@K@@둴mҲ@ @]BNy,@K@@둴rkݗ+k@ @w@%Ny,@K@@둴v1٘@ @DMry Ny,@K@@둴y7@ @p#ϳ1Ny,@K@@둴}duha@ @즆Ny,@K@@둴b@ @~Ny,@K@@둴ZlP@ @`Ny,@K@@둴.-^@ @o9_JNy,@K@@둴 $p"@ @~"-QrNy,@K@@둴J&@ @z6ܠgNy,@K@@둴@ @wEɔNy,@K@@둴@ @svO Ny,@K@@둴SfA@ @oC\Ny,@K@@둴' @ @hsBNy,@K@@둴~V. @ @aH|wNy,@K@@둴h/.@ @S8JNy,@K@@둴RD'c@ @5;TNy,@K@@둴7tYW!@Ԋ6jD88إHNy,@K@v3Gb@ QNy,@K@LCtYW!@Ԙv88إHNy,@K@*yj3Gb@ ߄|Ny,@K@[Fr6tYW!@ԧyj88إHNy,@K@9P33Gb@ t Ny,@K@itYW!@ԶP388إHNy,@K@Gffff3Gb@ H3ONy,@K@x3333tYW!@Թ@+MQ4B-Ny,@K@V]|3Gb@ ]wtNy,@K@ԇ*If{tYW!@Թ@+M`>B{[Ny,@K@d'c3Gb@ ;Ny,@K@ԕш0tYW!@Թ@+Mg5qNy,@K@s/@3Gb@ ıB,:Ny,@K@Ԥm tYW!@Թ@+MnߑNy,@K@ӂB 3Gb@ -Ny,@K@ԳtYW!@Թ@+Ms62,Ny,@K@ӐX1=3Gb@ m/Ny,@K@ӟH#3Gb@' QIj? Ny,@K@Qv>Jz@  LwNy,@K@Ӯ%:3Gb@' Q3vNy,@K@T~z@  'Ny,@K@Ӽǫ3Gb@' QNy,@K@xtz@ ǽNy,@K@h_3Gb@' QܜMNy,@K@5ɴz@ 9Ny,@K@ Fz@ #\%Ny,@K@xcz)z@  +$@ >y, @K@ǜ5@ F@PZp@qJ'`Ҥ'` Ny,@K@PZp@.'[@ǛY;C@qJNy,@K@PZp@̯$ @ǜ5@W?%Ny,@K@PZp@̒U@ǜ5@ވCNy,@K@PZp@u@ǜ5@FK#Ny,@K@PZp@W}z>@ǜ5@̤qNy,@K@PZp@:@ǜ5@̆FNy,@K@PZp@KIj@ǜ5@i~|PNy,@K@PZp@@ǜ5@L;Ny,@K@PZp@<@ǜ5@.o޵,Ny,@K@PZp@łi@ǜ5@ղNNy,@K@PZp@˨@@ǜ5@s3333Ny,@K@PZp@ˊ]@ǜ5@0Ny,@K@PZp@mT~@ǜ5@˹:Ny,@K@PZp@PwYnL@ǜ5@˜GNy,@K@PZp@34@ǜ5@g:Ny,@K@PZp@hR@ǜ5@b%ONy,@K@PZp@y@ǜ5@DNy,@K@PZp@l߽jY@ǜ5@'Ny,@K@PZp@ʾ*E@ǜ5@ ]x6Ny,@K@PZp@ʠ?5@ǜ5@1riNy,@K@PZp@ʃ8إ@ǜ5@l Ny,@K@PZp@far@ǜ5@ʲإHNy,@K@PZp@Iy @ǜ5@ʕR7>Ny,@K@PZp@+Y;C@ǜ5@xnvNy,@K@PZp@a@ǜ5@Z*Ny,@K@jŠ@ F@ǜ5@=m+Ny,@K@LjKZS@ F@ǜ5@ F$@ wNy,@K@@둴?@RΑ'rNy,@K@@둴z~5@ V'rNy,@K@@둴@@l'rNy,@K@@둴b@(7&01'rNy,@K@@둴*7 ܇@6sGy'rNy,@K@@둴d| Y@Ey]R'rNy,@K@@둴cz@T s 'rNy,@K@@둴ٟ伭@bbn*'rNy,@K@@둴%)m@q]s'rNy,@K@@둴Nn?@`N'rNy,@K@@둴12@ӎR7'rNy,@K@@둴öf#@ӝBhjM'rNy,@K@@둴;>@ӫP~'rNy,@K@@둴8 @Ӻ'rNy,@K@@둴sF%A@s^-Ny,@K@@둴 gb@s^g4.Ny,@K@@둴R>//@s^ Ny,@K@@둴"sP@s^ܤ?Ny,@K@@둴]\3"@ͱl Ny,@K@@둴i@SGNl Ny,@K@@둴h@Ol Ny,@K@@둴 V@Me`l Ny,@K@@둴Gs:G#@7|l Ny,@K@@둴EZ}@Jl Ny,@K@@둴}'@%z<3l Ny,@K@@둴^p@4l Ny,@K@@둴1w3@@sONy,@K@@둴l@@sCB4~9Ny,@K@@둴Fs@@s}y Ny,@K@@둴zN@@sLNy,@K@@둴%@Jvʟ8? Ny,@K@@둴V%J@@Y`ʟ8? Ny,@K@@둴ȣr`@gF^ʟ8? Ny,@K@@둴/?@vZ>ʟ8? Ny,@K@@둴R@ԄOʟ8? Ny,@K@@둴@:%@@sm+XNy,@K@J6Kg8إ@ԓۭ:ʟ8? Ny,@K@@둴zQzF@@sQyNy,@K@Y7N8إ@Ԣ>QZʟ8? Ny,@K@@둴Fљ@@syӪ6Ny,@K@g<8إ@԰ߣ`ʟ8? Ny,@K@@둴Ѝ@@sNy,@K@vzA8إ@ԿQvʟ8? Ny,@K@@둴*Q (@@s<[Ny,@K@ԅ*b8إ@"Ag\ʟ8? Ny,@K@@둴dN&Ԁ@@s< pNy,@K@ԓ,@Ы8إ@@+MohNy,@K@@둴[@@svX>Ny,@K@Ԣ^7~8إ@@+M,Ny,@K@@둴V@@s2INy,@K@Ա.w 8إ@@+MO{ZNy,@K@@둴g@@s뚾jNy,@K@Կ8إ@@+M$'Ny,@K@@둴NV @@s& /aNy,@K@B8إ@@+MĆzTNy,@K@@둴r)@@s`H/Ny,@K@@둴I@@s*|/Ny,@K@@둴|@@sկ9ONy,@K@@둴9R@@s6_RvNy,@K@@둴s*V@@sJʸNy,@K@1g Q`"@2dH#^5Ny,@K@@둴 ܃#5@@sAViNy,@K@1g Q}+^@A:^5Ny,@K@@둴V@@sD#Ny,@K@1g Q?^ F@O^5Ny,@K@@둴#E4w@@sK Z[Ny,@K@1g Q @^H_^5Ny,@K@@둴]*ZF@@s4]yNy,@K@1g Qjq@lIz^5Ny,@K@@둴$^@@soWFNy,@K@1g Q {@{\^5Ny,@K@@둴ҩ @@s?Ny,@K@1g QJ8? @Ҋ,S;^5Ny,@K@@둴 . @@sb =JNy,@K@1g Q-9d@Ҙ9^5Ny,@K@@둴GN@@sP;Ny,@K@1g QJЫj/@ҧov6^5Ny,@K@@둴:m@@sYn7zNy,@K@1g QhF#@Ҷ7~^5Ny,@K@@둴%;@@siNy,@K@1g QUP7P@IJ^5Ny,@K@@둴EZ:9@@sxNy,@K@1g QR@S^5Ny,@K@@둴O@@skr?Ny,@K@1g Q%Nn"@'4/^5Ny,@K@@둴6':@@sC?_Ny,@K@1g QzԲ@~Zy^5Ny,@K@@둴SjG@@s~\gNy,@K@1g Qa)m@@s BNy,@K@1g QJ@@sTbNy,@K@1g Q4ffff@@s-Ny,@K@1g QR)@@shޗlNy,@K@1g Qok`@@sNy,@K@1g QŒCA@@s*pNy,@K@9@lvJš>5@@sɊ"Ny,@K@Gήؔš>5@@sR5`Ny,@K@V š>5@@sNy,@K@e$\ š>5@@s?Ny,@K@s Gš>5@@swNy,@K@҂gbk/#š>5@@s5@@sv'ONy,@K@ҟš>5@@sV\NpNy,@K@ҮKIš>5@@sېNy,@K@Ҽ+Eš>5@@s&`K#Ny,@K@ˎP ^š>5@@s`%Ny,@K@/#š>5@@sl$Ny,@K@yš>5@@s4"F|Ny,@K@@둴œQ;\@@s;=Ny,@K@@둴¹# @@s%~Ni_Ny,@K@@둴'WOr.@@sB Ny,@K@@둴j@@s`[)Ny,@K@@둴dR@@s}FUNy,@K@@둴.;@@sԝ|Ny,@K@@둴L2gjr@@s2 Ny,@K@@둴iu:@@sԀuNy,@K@@둴Æ&@@sR>//Ny,@K@@둴ã?R&@@sNy,@K@@둴=@@s,sPNy,@K@@둴ހ{~ @@sJ̒Ny,@K@@둴}@@sg\3"Ny,@K@@둴@@sRCNy,@K@@둴6I"@@s^FNy,@K@@둴Svd@@s%_Ny,@K@@둴pgF@@sg/+gNy,@K@@둴Ď6@@s[Ny,@K@@둴īSA@@s>-b9Ny,@K@@둴ȗZ@@s40Ny,@K@@둴٩>@@sQsB؄Ny,@K@@둴C,z@@sn?Ny,@K@@둴 ^Y @@s‹EZ}Ny,@K@@둴=*L@@s©;q Ny,@K@@둴Z7.@@s~Ny,@K@@둴x'R@@s7XNy,@K@@둴ŕj&ù(@@s]RNy,@K@@둴ŲBԑ@@sFbn*Ny,@K@@둴co;!@@s;ԻNy,@K@@둴2V@@sX˗5;KNy,@K@@둴 ug۱l@@sv Ny,@K@@둴' Z@@sÓQfoNy,@K@@둴D>@@sð> Ny,@K@@둴b=GN@@sANy,@K@@둴2_@@sNy,@K@@둴ƜSy@@s\ ^Ny,@K@@둴ƺ@@s%zNy,@K@@둴HG@@sB* Ny,@K@@둴2U@@s`$6Ny,@K@@둴}@@s}g^cbNy,@K@@둴/gHu@@sĚ~Ny,@K@@둴LSш0@@sķk"Ny,@K@"Z@+Mc@f@^n؂RNy,@K@@둴it@Lߛ^ļXRNy,@K@*Z7O@@tn؂RNy,@K@@둴dž4v)@[tļXRNy,@K@8MNO@=ݱ!n؂RNy,@K@@둴Ǥ`ܺ@j"=ݱ ļXRNy,@K@@둴^J#@x^ļXRNy,@K@@둴ޡ @ԇe;ļXRNy,@K@@둴W#F@@sg}Ny,@K@Cy]RarhR@ԖSyļXRNy,@K@@둴&ˉ@@sńnNy,@K@RvarhR@ԤiCļXRNy,@K@@둴6ig@@sŢ->Ny,@K@`^arhR@ԳI+ļXRNy,@K@@둴S.w @@sſEjNy,@K@o]sarhR@|n?ļXRNy,@K@@둴p'9@@s܈b= Ny,@K@}eParhR@Ќ1vļXRNy,@K@@둴Ȏ22@@sЍNy,@K@Ԍ(ܘarhR@@+MNy,@K@@둴ȫt@@sn7Ny,@K@ԛA?arhR@@+MA/jQNy,@K@@둴ȷw@@s4Q (Ny,@K@ԩTarhR@@+M<[Ny,@K@@둴}@@sQNy,@K@Ը+IarhR@@+M JNy,@K@@둴<:@@snN&ԀNy,@K@&RغarhR@@+M> ZNy,@K@@둴 J@@sƌ/bNy,@K@ǨarhR@@+M[LGbNy,@K@@둴=¸1@@sƩ\RJNy,@K@@둴[S&@@sƞ쿱[Ny,@K@@둴xG3+@@s>Ny,@K@@둴ɕ$N@@s$1-Ny,@K@@둴ɲv@@sgCNy,@K@@둴@@s;-שNy,@K@@둴S6+o@@sXةyNy,@K@@둴 hn~Ub= %9!Ny,@K-֥c0<Ub= Ǹ#-Ny,@K-֥F^Ub= Ǜ#RNy,@K-֥)vUb= ~]Y[Ny,@K-֥ 4QjUb= aʅNy,@K-֥Ub= C%:Ny,@K-֥ѮLAUb= & ZNy,@K-֥ĴkxUb= RNy,@K-֥ė)rGUb= v_خNy,@K-֥yu Ub= DNy,@K-֥\MNUb= Ʊ9VNy,@K-֥?`q`lUb= ƔFtFNy,@K-֥"Ǝ*Ub= w5GiNy,@K-֥,b^Ub= YNy,@K-֥瘒5 Ub= <~^pNy,@K-֥U yUb= n؂RNy,@KF̷4avvn؂RNy,@KF0̣jDAxpn؂RNy,@KFs3333@On؂RNy,@KF_^ Nn؂RNy,@Kkaw+XR%QHn؂RNy,@K SP+XRQn؂RNy,@K"h+XR} =n؂RNy,@K84J+XRaއ n؂RNy,@KNvh<+XR8@n؂RNy,@Kd 3+XR~0Ln؂RNy,@Kzk+XRzYrn؂RNy,@KV证b+XRvZgjrn؂RNy,@KAԶ+XRs Rژgn؂RNy,@K-Sq+XRnhn؂RNy,@KZN+XRgpn؂RNy,@K~+XR`n؂RNy,@Kϗ+XRQ|n?yn؂RNy,@K'o^+XR'}I׺fn؂RNy,@KS{5X+XR@GHKZS3n؂RNy,@KR*o?S+XR@ZErqn؂RNy,@K'}R;6+XR@ds_ n؂RNy,@K^|+XR@k: ˚n؂RNy,@Kǻ$+XR@qqRn؂RNy,@K.+XR@u2w$n؂RNy,@K~ץm+XR@x(Zn؂RNy,@K{ +XR@|lmd(n؂RNy,@Kwd&J+XR@n؂RNy,@Ks37e+XR@dMn؂RNy,@Kp~eZ+XR@@Sn؂RNy,@KhTɅo+XR@jHs6Xn؂RNy,@Ka>lLY+XR@fpdn؂RNy,@KTj =J*+XR@:V{n؂RNy,@K7!Xu +XR@,Qn؂RNy,@K@A+XR@dIUn؂RNy,@K@WzD#r+XR@In؂RNy,@K@c ʧX+XR@ETn؂RNy,@K@j^sGyB+XR@/&NHbn؂RNy,@K@pץ;+XR@ln؂RNy,@K@t;u!+XR@Gn؂RNy,@K@x(N+XR@]n؂RNy,@K@{СƎ*+XR@(qJn؂RNy,@K@x 5+XR@=n؂RNy,@K@3*Ϸ+XR@RVn؂RNy,@K@dR}+XR@m>n؂RNy,@K@9+XR@zcsmn؂RNy,@K@ /k+XR@j\Nn؂RNy,@K@YDS+XR@TU)n؂RNy,@K@p+XR@>s^n؂RNy,@K@q+XR@(܃#5n؂RNy,@K@].8!+XR@ٱn؂RNy,@K@ +XR@ n؂RNy,@K@ i+XR@|x n؂RNy,@K@0p+XR@0MU&n؂RNy,@K@K+XR@]8n؂RNy,@K@`jU+XR@ҰYW!n؂RNy,@K@u͉+XR@Gn؂RNy,@K@0+XR@m2jn؂RNy,@K@j+XR@1̫֔n؂RNy,@K@i"t+XR@?Ffn؂RNy,@K@SЍK+XR@Fn؂RNy,@K@=&+XR@rC{n؂RNy,@K@'>+XR@n؂RNy,@K@6+XR@{dan؂RNy,@K@#EkD+XR@͢n؂RNy,@K@>E+XR@en؂RNy,@K@T>a+XR@*b0n؂RNy,@K@hҡ+XR@O4iPrn؂RNy,@K@},+XR@>n؂RNy,@K@GI[W+XR@9I}I׺n؂RNy,@K@Sq+XR@Sqn؂RNy,@K@1a+XR@#am݃n؂RNy,@K@kK'+XR@ln؂RNy,@K@v`^i+XR@ vn؂RNy,@K@ &p+XR@[S n؂RNy,@K@tW+XR@S Nn؂RNy,@K@z ,8+XR@lWn؂RNy,@K@Tm?+XR@ᣆ n؂RNy,@K@d+XR@Vn؂RNy,@K@ٸx+XR@˸xn؂RNy,@K@Ni<+XR@@fn؂RNy,@K@͌} +XR@ken؂RNy,@K@8e+XR@*en؂RNy,@K@bV6+XR@}n؂RNy,@K@"x+XR@xn؂RNy,@K@^+XR@^n؂RNy,@K@ ]+XR@]n؂RNy,@K@7G+XR@t n؂RNy,@K@ sщ+XR@,n؂RNy,@K@l'p?-+XR@/ʸn؂RNy,@K@2l+XR@in؂RNy,@K@V<G+XR@T;n؂RNy,@K@JRiY`+XR@ޥBn؂RNy,@K@@T+XR@*Ln؂RNy,@K@_#̍+XR@SFn؂RNy,@K@*i~($+XR@4}n؂RNy,@K@t7i++XR@Ⱥ =Jn؂RNy,@K@~wl+XR@?P;n؂RNy,@K@(,n+XR@=7zn؂RNy,@K@(ܘ+XR@xKYnLn؂RNy,@K@s<%J<+XR@Оn؂RNy,@K@諤~+XR@Ukr?n؂RNy,@K@] ~+XR@'?_n؂RNy,@K@ö+XR@baȆn؂RNy,@K@# B+XR@ Bn؂RNy,@K@^le@y+XR@lTbn؂RNy,@K@񙙙+XR@?Kn؂RNy,@K@vf+XR@Lvޗln؂RNy,@K@ +XR@n؂RNy,@K@Hp+XR@pn؂RNy,@K@Ɋ"+XR@,nn؂RNy,@K@P"WC+XR@6`n؂RNy,@K@+XR@q n؂RNy,@K@2+XR@n؂RNy,@K@m\+XR@\n؂RNy,@K@.+XR@ }n؂RNy,@K@)'O+XR@[)'On؂RNy,@K@\Np+XR@\Npn؂RNy,@K@W3LB+XR@3LBn؂RNy,@K@K#+XR@ K#n؂RNy,@K@?%+XR@E?%n؂RNy,@K@$+XR@~n؂RNy,@K@AJ#|+XR@J4"F|n؂RNy,@K@{h{+XR@h{n؂RNy,@K@T+XR@/Tn؂RNy,@K@qT2+XR@iہin؂RNy,@K@+`S+XR@`R7n؂RNy,@K@ePm+XR@%n؂RNy,@K@k/:+XR@k/:n؂RNy,@K@d+XR@Stqn؂RNy,@K@uZ9+XR@u>n؂RNy,@K@O}^_+XR@}^_n؂RNy,@K@++XR@+n؂RNy,@K@1+XR@>bRn؂RNy,@K@;ՙ$+XR@x+0/sn؂RNy,@K@:p.fE+XR@p.fEn؂RNy,@K@tD+XR@4 n؂RNy,@K@yR+XR@(n؂RNy,@K@颾+XR@bn؂RNy,@K@$'^V+XR@'^Vn؂RNy,@K@^7\+XR@׭&#n؂RNy,@K@37Cc+XR@4 ܭn؂RNy,@K@ӹ@5z5+XR@L@5z5n؂RNy,@K@>3+XR@>tGVn؂RNy,@K@Hù~(+XR@1n؂RNy,@K@HKI+XR@Hn؂RNy,@K@C+XR@62n؂RNy,@K@Uc+XR@qUcn؂RNy,@K@2;n+XR@Labn؂RNy,@K@m_`4+XR@_n؂RNy,@K@ŸU+XR@ ŸUn؂RNy,@K@iv+XR@[iun؂RNy,@K@Α+XR@Αn؂RNy,@K@Wv+XR@vn؂RNy,@K@G+XR@ Gn؂RNy,@K@̀+XR@E|An؂RNy,@K@?+XR@?n؂RNy,@K@A>+XR@>n؂RNy,@K@|ھ'+XR@fn؂RNy,@K@8+XR@ˏ.n؂RNy,@K@CoY+XR@5* n؂RNy,@K@+m++XR@RP6n؂RNy,@K@f&l.+XR@o^cbn؂RNy,@K@F+XR@'9n؂RNy,@K@2D+XR@k"n؂RNy,@K@CRe+XR@\NZn؂RNy,@K@P=O+XR@䞧n؂RNy,@K@ƒ+XR@JM+,n؂RNy,@K@G٘*+XR@#yn؂RNy,@K@ΝsB+XR@n؂RNy,@K@!J+XR@qjn؂RNy,@K@52P$+XR@ε)Kn؂RNy,@K@/w}+XR@ᴁ VyBNy,@K@Ln7+XR@ᴁ V˖^p3;Ny,@K@i{R+XR@ᴁ V˳@NNy,@K@?+XR@ᴁ Vl5Ny,@K@ +XR@ᴁ V&GNy,@K@Ÿf;+XR@ᴁ V i+XNy,@K@RJ+XR@ᴁ V(TXFNy,@K@J쿱[+XR@ᴁ VEyNy,@K@+XR@ᴁ Vc1V}Ny,@K@61-+XR@ᴁ V̀t3KNy,@K@TC+XR@ᴁ V̝ͯJNy,@K@qV6*^x+XR@ᴁ V̺7ZNy,@K@ةy+XR@ᴁ V_Rv@ʄg}0G@'9@ʄg}0GNy,@K@Ÿ@Zcz@}@ZczNy,@K@{/@SIz@W)Zl@SIzy, @K@'=@,N@Փn@J'$18@'=@;:~?‹*k%?|h@‹*k'`4  @iffffffLOCUST ST. LOADING DOORSNy,@K@ݴ Vb%O@M#hb%ONy,@K@zps2hR@އ=s2hRNy,@K @ݴ Vb%O@M#hb%ONy,@K@M#h+XR@5+XRy, @K@KHqJvل [@MwȎy#z3@KHqJ~7G?u\(;dZ@u\('`\ @c UP TO DRESSING ROOMSNy,@K@ߴ VrhR@ߴ VʰXRNy,@K\-b%O-֥b%ONy,@K[K'+XRȣr`+XRy, @KS%;Ğq*tO|@(S%;Vטة?kB& %u%?|i@kB& %'`X @c TO LOBBYy,@KRjI8!vdvjIRoj/I9K!v8!KA4v)Ny,@K@' Q. 8? @' QLIy, @K@1U>-<Q@;F3*@1U>-<Q?l1l@9XbO'`P @iffffffTO LOADING DOCK y, @K @F[@{Zcz@F 1@W@F 1@{Zcz?e%?|i@VE1'`פ @c EDGE OF TECH GALLERY ABOVE - CLEARANCE 12'-0" MAXNy,@K;Ub= @H4Iz֥@H4IzNy,@K Dz@(tIz@i@ar Ny,@K d@NaZW&E@ b0Ny,@K/USk@NaZu?|@6 dNy,@K"@NaZC@^证bNy,@KQH@daY[@ >Ny,@KV%a0n@Y)ԥ":@Ny,@K+tW@,bsM5@'Ny,@K4N@@\Ir"Y@oNy,@K@:u @Su1;@%:Ny,@KK@nrGN @QZOОNy,@K F(@tl@G7Ny,@K8ӑ @}s&-f@ʼ ܭNy,@KkIO@ֲ(ܘJϷb@2o?RNy,@K@@n됧@FNy,@K҂7@$b$N 2@D͉Ny,@K_Ru@ gbn;@yгNvNy,@Ke}@E&d&Ԁu@l+0/sNy,@K99:1@en;Gp?-@ 8? Ny,@K^S N@µe7\@@NNy,@Koπ3@ ,^-#LX@! Ny,@K7I@$#>Gx(g@l[)Ny,@K~@ Gk[)@6⾋jNy,@K@N@6h3ʖ@_YC9:Ny,@K;(ʁ@Iz<_l@KaFNy,@K/ @t/%=?7i@-MryNy,@Kȣr`@µeH@CvNy,@Kpc@(F}֥@UUNy,@K`J1@;@i/YNy,@K%@G}0Gѧ@:Ny,@Ko޵-@LBV)@@Ny,@Kc@qbc@ QNy,@K80c@(r}:c{[@?KNy,@Kdʸ@1J^6h@F^Ny,@Kcʸ@1Sxa/ @HJNy,@KR@Q̼-֥@I^Ny,@KyȆ@}0G@Uv@IzNy,@K {֥ll hȣr`{J8? Ny,@K hȣr`{J8? -֥1rNy,@K -֥1r-֥#Ny,@K Ǖp?-5mVRONy,@K JcitJƛ(f^Ny,@K @i5b= 6-֥3zNy,@K 6-֥3zcʸl Ny,@K a/ &a/ RNy,@K a/ >5J<5Ny,@K;]x=qyRkrhS >y,@K;ku-p+0/s'+ku-7?Hymv_Rv:uG6{K~쿱[伭Ig߽jYXĽ4irɈm+߂g R-V"VԀux N9FoimQ; f_->jԭ,]#-+b0UEnt8إNjg>aGH8})P~AfN3!< G#R7?+33KI!ln /r/f'9,:^bn**sy 6(bLÁƆb'_RvMkr?'+A[#($:C)MrOEXN?* fȣr`-l ~e0 p|W#F3~J4~97ud0+<\gɣAǴ_0>FIGNQkBNwPsr ,8U^pu]zcza'OeGg%n9!3vxz>k6] tЦv!W?1nFw gz,AJML_tGp?-ʾ1f:ق;n'Zjj-6_Ru.9yIAr.jvd"WBn(ܘg./$(cvF4IO3Dg۱lD˗5;K4UQ̼ D#g w3xyf#xٺF(:d8إ>)k)Rh8~f GϢjxmĤ#̍վ>F657\ts"|F5M77V'aILѰE4\7.pj\̉as^伭A$~閕ƆaffffRk/#2F#п{ F縶nglC% RC{k)^"5c,Ct?OGkZ^cZ+tZl[]H ;U~Q/ 3`ܹ|K\<[pzsf4m]ÕI E亻.ե7\pNZ K' TaZ`xtR/B؄\MDVq}܈G%6ll.,PYV5B2e3nE+ϑ86m3 13q=6nC?lH /4":LhRQl,*+U)m7&YBXUSk]fi^m8`QUvcx5s*f# u%hCB".wkޮ@+Ml7.nCXĽn ob-$hp+#yd>oopxtD~Up+0/s$ILʳp"NJUput?o;Bb/ f5c}9o[)Q*m"bRmM#hNm82vu8A$~m3vOL'zmf\mYddmry mmTy~mYwBVLmC:G#bsm,5Him0fPm+ϑ)l'j@Y|l7.`lNy,@K;!zȣr`LrX/)%Qa!zȣr`5.;ZjjxOLnmO1RpϷbAZusK6zz1P/rR# B ~ M77 ,GoU͑BԑRZL/K?R&-dQ0[l7aA[#)m+~3e+wneqq[vdi^k%ދ;2$ve4Fs:%_U>YZ$/qzNUyW:P/qT/@KwBVGNMjWCH& 8? ?_-B؄< ;O&I8vrK5b= F3=WuKj0 ?{.ҳ.'[-5 Gej+5H( )m*b:*) ZMZR)Oco;!aЍ)%QatT])Oco;!Pm) Z87 ܇*b>//+5H•-5 x.ҳv9y0 .3=W8إ5b= &O8v:+U< ;M>//?_`&01CH&s4X!GNMj[S KwBV)P/qT'UyWpCZ$/ϙ6_MOe4Fs4X!k%ދ;2rC{q[vd$}wne&һ#W~3e6~l!qC9F~(EglV|N/µey r-pstGVd^NYZRBԑU:{~ ͢ !uBԑpCqRCO4/Qܲ#-E4wk8'Kja{;h+b3nv˒: ס<>Ʌo &쿱[a٩T=&5ڭ`(07FG9B؄ $Ctܐ$?Lxv'UF^*1_Q[ ,p?-h.+"r&.ŸU{"/„,.BJ'kŽi.Ƽ-t?O—`+G¡* )Kc,CªY>&JN³a{R"Su¼>_l}^_ӝf /́-Dܩ%A? # A^7\f$5Gi'9azR/vш0a =8Da7XdYZ3"ҝ>p~]!> ,%BN(GNT,!forN/r+ϑh{2EEz5Crqp8y3K;H8}{ 5Gi>Αsf 0A'tkUvD_vc3G [[+I>SxLrXNy,@Kk̎Oj`/ç ZNy,@KIz<$shhÞ{'jNy,@K'}dQ0· Dj'VÕW*b|Ny,@K'}dQ0™9VB{k)Ì2n?Ny,@K'}dQ0|tFoπ3à /jQNy,@K'}dQ0_D5Gi4yեbNy,@K!b E?CAV`^pr&Ny,@K@/]=ȸugvNy,@K~vB{~y^y?Ny,@KSq-QEAvSUTԻNy,@K}tܐ) ^L08إNy,@K9JM+,TsbC tܐNy,@K-֥Y&dUb= Ů QNy,@K(Egd Z$[)9czNy,@K-֥;H8}Ub= ŐʦL/Ny,@KFvBɒUb= s Ny,@Kv.tFUb= VEqbcNy,@Kgݨ#Ub= 9RNy,@KLX7Ɋ"Ub= e47?Ny,@K1 b{]2P$Ub= |ЯNy,@K'.jvm Ub= :(FNy,@KZ>9rEOUb= \NNy,@KTGp?-WOr.Ub= Ħ$>Ny,@K֥+6+Ub= ĉq#Ny,@Ko֥威 VUb= l.pNy,@K֥%ދ;2Ub= NMDVqNy,@K~a/ vwUb= 1;Ny,@K b= xUb= gFNy,@KV:q5Ub= #XĽNy,@KǕp?-7 ܇Ub= {Ny,@Kzȣr`*Ub= üaZNy,@KOb= .'[Ub= ß[.'[Ny,@KДb= Y$ Ub= Â-Ny,@KO"UKrhSUb= dպn7Ny,@KqJrhSUb= G BNy,@KǕp?-ùIbJUb= *P/Ny,@K"Kv2پ5Ub= Ny,@K_'B؄ Ole6HX1=Ny,@K8إɒ"q7fNy,@K wN&tnIb= krhSNy,@K_|<"WBԉqkrhSNy,@KIdo?%zȣr`yF#Ny,@K3wGg̔b= r=>NNy,@K^ 8? s֥ktꍨNy,@KrhSUb= $Ny,@KUrhSUb= aNy,@K* :B鉜4Vm5m Ny,@K]6{7fxC1Ƣ.wΑNy,@K;Ub= R֥RNy,@K b= x%O@i5b= Ny,@K d-l W&E=rrC{Ny,@K/USk-l u?|eK#Ny,@K"-l C_INy,@KQH5̫֔Y[խnNy,@KV%a0nI"" )ԥ":J;Ny,@K+tW\^M5rNy,@K4Np% r"Y07y Ny,@K@:u WOr.u1;U/Ny,@KK;c,CN "Ny,@K F(Opl7iNy,@K8ӑ 9!&-f}^_Ny,@KkIO#̍JϷb"mNy,@K@3en됧KqTNy,@K҂7T*"- 2s٘*Ny,@K_Ruken;5Ny,@Ke}ts&Ԁu\yJoNy,@K99:1OGp?-VNy,@K^S Nffffe7\INy,@Koπ3m*#LX vNy,@K7I섔NGx(gffffNy,@K~<k[)3Ujn3Ny,@K@Nf1@NʖG'Ny,@K;(ʁxR<_lEONy,@K/ fY$ =?7i2INy,@Kȣr`=-eHmµNy,@KpcAiB}֥w6zNy,@K`J1;7 ܇h+bNy,@K%@+ѧһ#WNy,@Ko޵-@߹8V)@,ʼmNy,@KcG;>cF#Ny,@K80cE D:c{[R'،Ny,@KdʸLM#h^6hf7.Ny,@KcʸYwV>xa/ }#Ny,@KRfڊa-֥”zaNy,@KyȆo˶@Uv°xRNy,@K;SxLrXRÑONy,@K;RÑO+e}HENy,@K;a/ DT+e}7>Ny,@KΖRr%OfdQ0þXRNy,@K@&#Ȇ=:Ǥ~Ny,@Kuw×;ThNy,@K`ÄyWXĽ4~hSNy,@K7F({Rf>YX1=Ny,@Klr4~9\OI4'Ny,@K)Fj>4D^ԢNy,@K^Kaa& ׇΕù Ny,@K XH߹8ð Ny,@Kk̎Oj`/ç ZNy,@Kb= JfU/zȣr`Q̼Ny,@K DzXR@i5b= y, @Kȣr`k˶ȣr`¹5'`'`Ny,@Kȣr`X5ȣr`X5Ny,@Kȣr`k˶ȣr`¹5$ y, @Kȣr`@"czȣr`@}0G'`'`Ny,@Kȣr`@ڰczȣr`@ڰczNy,@Kȣr`@}0Gȣr`@"cz$ GNy,@K;@@+Mk@@+MxRNy,@K;@0둴k@0둴xRNy,@K;@@kݨ#@Xiг˩D#y,@K@Uv͒{Ѝ@ vHZ@Uv͒{Ѝ@ vHZ@UvHZ@f@VNy,@K@@+Mz[@<+|rONy,@K@@+M˘+$@[rONy,@K@@+M˵ouK@q rONy,@K@@+Mұfo@ jNrONy,@K@@+MFs@%vrONy,@K@@+M 6h@4c rONy,@K@@+M*y@C'rONy,@K@@+MG ^@Q =JrONy,@K@@+Mdz@`G\|ؙrONy,@K@@+M̂B* @n詓 rOy, @K@Ѹ $@GC'c͝k@Ѹ W[l7a?wHvy|1l@wHvy '`0 @iffffffTO OFFICESNy,@K@ Q_EAR@"C,z_EARNy,@K@؀둴(+@(+Ny,@K@pv]Y[@Vn؂RNy,@K@p˓v@ar n؂RNy,@K@p˰▢nT@9$C؝n؂RNy,@K@p%9!@Vh]13n؂RNy,@K@ph@sn؂RNy,@K@p=@Đ/jQn؂RNy,@K@p% q@Į0<[n؂RNy,@K@pC0z9@rֈ7qn؂RNy,@K@p`se@In؂RNy,@K@p}%@Gbn؂RNy,@K@p̚!%@#;}n؂RNy,@K@p̸;QzF@@~(Egn؂RNy,@K@p~f#J@]qn؂RNy,@K@pO@{\fn؂RNy,@K@p|@ŘFvBn؂RNy,@K@ohR@ŵi]n؂RNy,@K@/i^hR@n؂RNy,@K@Ĥ[ hR@GLYn؂RNy,@K@MrPhR@e! n؂RNy,@K@BhR@Ƃ\Mryn؂RNy,@K@"hR@Ɵ,Bn؂RNy,@K@,hR@ƼKLn؂RNy,@K@7 jhR@%(9-n؂RNy,@K@TN9q:hR@g on؂RNy,@K@qӝfhR@m7;n؂RNy,@K@ŎmhR@1cn؂RNy,@K@ŬnhR@O/ n؂RNy,@K@Yz3hR@ls"̳n؂RNy,@K@hR@ljO3Dn؂RNy,@K@޷4hR@ǦPNn؂RNy,@K@!!QahR@:=n؂RNy,@K@>c7 hR@}yЦn؂RNy,@K@[ hR@'77n؂RNy,@K@xLXhR@Fn؂RNy,@K@Ɩ,yhR@9F,n؂RNy,@K@Ƴo4/QhR@VΑn؂RNy,@K@бwJhR@sqTn؂RNy,@K@qJhR@ȑ =Jn؂RNy,@K@ 76uhR@ȮQ}wn؂RNy,@K@(z~bnhR@˔vn؂RNy,@K@EBhR@ֲ(ܘn؂RNy,@K@bhR@LUC(n؂RNy,@K@ǀB]yhR@#['jn؂RNy,@K@ǝzԲhR@@YnLn؂RNy,@K@ǺY;ChR@]@n؂RNy,@K@ &VhR@{$En؂RNy,@K@MrhR@ɘg8? n؂RNy,@K@8إhR@ɵkr?n؂RNy,@K@/PhR@tꍨn؂RNy,@K@M=>NhR@/n؂RNy,@K@jX߽jYhR@ ryWn؂RNy,@K@ȇ<hR@*\n؂RNy,@K@ȤhRhR@Gn؂RNy,@K@ RhR@e:P.|n؂RNy,@K@d)(vhR@ʂ}n؂RNy,@K@T~hR@ʟ\n؂RNy,@K@]hR@ʽ~0n؂RNy,@K@7,RhR@ENrn؂RNy,@K@TnihR@<n؂RNy,@K@q<hR@En؂RNy,@K@Ɏ둴hR@2@+Mn؂RNy,@K@ɬ7IjhR@OPFn؂RNy,@K@yhR@l}0Gn؂RNy,@K@}z>hR@ˉ]n؂RNy,@K@ BhR@˧/@n؂RNy,@K@!BahR@\$>n؂RNy,@K@>$ hR@ើHn؂RNy,@K@[.'[hR@`n؂RNy,@K@y aZhR@#'n؂RNy,@K@ʖM٩ThR@9fsBn؂RNy,@K@ʳXĽhR@V?^Wn؂RNy,@K@FhR@s߹8n؂RNy,@K@r/hR@̑/< n؂RNy,@K@ XMDVqhR@̮q n؂RNy,@K@(phR@˴ Vn؂RNy,@K@E݁#hR@6+n؂RNy,@K@c /%hR@:Ɂn؂RNy,@K@ˀc\NhR@#}'On؂RNy,@K@˝(FhR@@"Nn؂RNy,@K@˺ЯhR@^djHn؂RNy,@K@+mhR@{E n؂RNy,@K@nRhR@͘LBn؂RNy,@K@qbchR@͵ n؂RNy,@K@/ hR@ bn؂RNy,@K@M6\hR@PH8}n؂RNy,@K@jyHJhR@ dn؂RNy,@K@̇JfUhR@*Մn؂RNy,@K@̤M77hR@HZn؂RNy,@K@A yhR@e[+n؂RNy,@K@߄5 hR@{M#hu`y, @K@3Pv:xR@Tr}x^5'`'`lNy,@K@Tr}xR@Ρm ex^5Ny,@K@\xR@ξH8}x^5Ny,@K@8HJxR@dx^5Ny,@K@V}xR@5|Kx^5Ny,@K@s_UvxR@x$x^5Ny,@K@͐ܠxR@3Pv:x^5$ y, @K@ܠO@ͦr/Y{'`X'`LNy,@K@ͦr/YO@I {Ny,@K@ O@fL/{Ny,@K@f+O@τ9Q{Ny,@K@bQ̼O@ϡ{JfU{Ny,@K@vO@ϾUv{Ny,@K@8VCO@ܠ{$ Cy, @K@EPnP(+@U:z2˅hR'`@'`(Ny,@K@U:z2(+@Tr}˅hRNy,@K@r}J(+@ WOr.˅hRNy,@K@Ώ1S(+@lev˅hRNy,@K@έI^(+@( {ؾ˅hRNy,@K@Ev(+@6;˅hRNy,@K@VC(+@EPnP˅hR$ y, @K@ПĨ;O@ 4r}{'`D'`,Ny,@K@ 4r}O@V {Ny,@K@'v\O@eH$>{Ny,@K@DHJO@sq2rC{Ny,@K@a}O@ЂH{Ny,@K@?UvO@Б,w{Ny,@K@ϜܠO@ПĨ;{$ 7y, @K@ѕ(+@ϸ ˅hR'`'`Ny,@K@ϸ (+@ЭܱF˅hRNy,@K@\(+@м$>˅hRNy,@K@YHJ(+@9q2rC˅hRNy,@K@M3+(+@q˅hRNy,@K@鍊(+@|shh˅hRNy,@K@%Ƚ(+@ѕ˅hR$ Ny,@K@@+M̮m! @~n؂RNy,@K2@茹?!O@0둴\:Ny,@K2@$O@0둴}Ny,@K2@A= R@0둴̯/bNy,@K2@мevGO@0둴̓Ny,@K2@ЮBO@0둴vR2Ny,@K2@ПeyO@0둴Y'9Ny,@K2@АYO@0둴;.w Ny,@K2@Ђ"z$O@0둴gNy,@K2@sxFO@0둴FˉNy,@K2@d&ù(O@0둴W#FNy,@K2@V>٭O@0둴 Ny,@K2@Gm+O@0둴˩~J#Jy,@K @@+MɥO@4P5y, @K },iJhq^Xm'`'`Ny,@Khq^iJ},XmNy,@Khq^Xm},iJ$ k$@ 7y,'`^@@WUv9 ̑T@tIz'`'`@tIz@WUv@k =o9 ̑Tk =o Stage FloorHuMUiH},@FXAXTO@@H?u@E_Qz'n #.???t%O@T?20Ae412-414y,'`x@ @bn*&6]-@G8? F*OT.???@l ?20Ae415-417y,'`@ @ BԐx"F{@ǭ7 d.???t%O@^hR?20Ae418-420y,'`@ @ѕi\3#@˥7U:nX.???*|/@^$+?20Ae436-438y,'`@ @ѕi8|=h@˥7U: ~~.???. @^$+?20Ae439-441y,'`@ @ѕiPGV@˥7U:|.C.???s8إ@^$+?20Ae442-444y,'`@ @ѕikeQp@˥7U:3 .???r@^$+?20Ae445-447y,'`@ @ѕi݌'Ó@˥7U:T.???^5@^$+?20Ae448-450y,'`@ @ѕi@z:lX@˥7U:@.), .???@`@^$+?20Ae421-423y,'`@ @ѕi@Hp@˥7U:@yb.???@h'@^$+?20Ae424-426y,'`@ @ѕi@X-@˥7U:@8x.#(.???@D.'[@^$+?20Ae427-429y,'`@ @ѕi@r T@˥7U:@xp3<.???@>µ@^$+?20Ae430-432y,'`@ @ѕi@> @˥7U:@^ O3D.???@ln @^$+?20Ae433-435y,'`@ @QE5@QB@U70#.???@4IzS?20Ae397-399y,'`@ @!^F@Zg7@E_Qz@reK.???@AF@T?20Ae400-402y,'`@ @bn*@BJ@G8? @Xw{k).???@ڰcz@l ?20Ae403-405y,'`@ @ BԐ@O: @ǭ7@~d.???@AF@^hR?20Ae406-408y,'` @ y[xTCe!'Ol :2+.???˶\N?20Ae391-396y,'`@ wB@S-+5' B/???>50T[)?.0Ae542By,'`@ @q<Ⱥ@œuF.???@F!'O?20Ae385-390y,'`4@ *K@ao=@ơ%7&/???@Ɔ !'O?.0Ae544By,'`(@ @e1n7@HD@/@Ż@W .???@P}0G@KB?20Ae451-454y,'`0@ @bg'V@żV5@) @ /???@Iz@KB?.0Ae546By,'`L@ @Kv>J9 @*#l#2.???Dž=B@GV?20Ae455-458y,'`@@ @^j/{@%ER/???0Kv2@GV?.0Ae547By,'`H@7CcD<[1ws.???rn+?00Ae54-555y,'`d@z+ϑ'< 4hכ?G 0hUS.???+ržtةy?00Ae52-535y,'`X@z+ϑAbכ?GtBy9.???`(^žtةy?00Ae47-495y,'``@z+ϑ@zR&=כ?G@3g$L.???@[)žtةy?00Ae43-445y,'`|@u#@Rj.cz@kh.???@h'Iz?00Ae39-405y,'`p@.T`aD^o.???r';tl?00Ae37-385y,'`x@ì%]v{"x 8i9䡭dS.???^}kr@А҆?00Ae35-365y,'`@S{o_,4 AU}DtL..???iCJ'W?00Ae31-325y,'`@:@^E+F@z.???@[)ncx?00Ae27-285y,'`@Bi^@sv!nF}0D@37.???@h' F?00Ae23-245y,'`@z+ϑc"כ?G?I.???8>p~žtةy?00Ae50-515y,'`@z+ϑe7fכ?G@.???@vAružtةy?00Ae45-465y,'`@z+ϑ@/3\כ?G@I.???@_jžtةy?00Ae41-425y,'`@ä4(f]?t Zx.???qb =J[#?00Ae33-345y,'`@:3ZÆ+F@׳6.???@"Hncx?00Ae29-305y,'`@:@$+F@qD.???@7\Nncx?00Ae25-265y,'`@:G#@e;N]`@oth.???@_IzM'?00Ae65-725y,'`@RmzV P (ş1zV3.??? C.'[?00Ae83-905:y,@-wbP$@ y,'`dA>݋aGJ@KnS'`'`L@KnS>݋a@k =oGJk =oscaleuMUiHuMUiH},@FXAXTO@@H?݋aGJ@KnS'`'`,Jy,@K >݋a^5D^@JfUJy,@K >݋a٧ 39_Jb@5hJy,@K 9_JRfAҡ٧ 3Jy,@K >݋am3v9_JRfJy,@K 9_J9pCAҡm3vJy,@K >݋a\f9_J9pCJy,@K 9_JiAҡ\fJy,@K >݋a$)k3U9_JiJy,@K 9_J6љAҡ$)k3UJy,@K >݋a{9_J6љJy,@K 9_JnO3DAҡ{Jy,@K >݋a74fw9_JnO3DJy,@K 9_JhAҡ74fwJy,@K >݋aɛG9_JhJy,@K 9_J{AҡɛGJy,@K >݋a\O3D9_J{Jy,@K 9_J%4fwAҡ\O3DJy,@K >݋a@7Q̼9_J@1Jy,@K 9_J@n}Aҡ@7Q̼Jy,@K >݋a@JfU9_J@n}Jy,@K 9_J@d3"Aҡ@JfUJy,@K >݋a@19_J@d3"Jy,@K 9_J@IQ̼Aҡ@1Jy,@K >݋a@<39_J@IQ̼Jy,@K 9_J@o/̫֔Aҡ@<3Jy,@K >݋a@p.fE9_J@o/̫֔Jy,@K 9_J@Jc Aҡ@p.fEJy,@K >݋a@ax9_J@Jc Jy,@K 9_J@K,yf#Aҡ@axJy,@K >݋a@&_)V9_J@K,yf#Jy,@K 9_J@%Aҡ@&_)VJy,@K >݋a@ssN?9_J@%Jy,@K 9_Jb@5hAҡ@ssN?Ny,@K>݋aRfrUnŰRfNy,@K>݋a9pCrUnŰ9pCNy,@K>݋airUnŰiNy,@K>݋a6љrUnŰ6љNy,@K>݋anO3DrUnŰnO3DNy,@K>݋ahrUnŰhNy,@K>݋a{rUnŰ{Ny,@K>݋a%4fwrUnŰ%4fwNy,@K>݋a@%rUnŰ@%Ny,@K>݋a@K,yf#rUnŰ@K,yf#Ny,@K>݋a@Jc rUnŰ@Jc Ny,@K>݋a@o/̫֔rUnŰ@o/̫֔Ny,@K>݋a@IQ̼rUnŰ@IQ̼Ny,@K>݋a@d3"rUnŰ@d3"Ny,@K>݋a@n}rUnŰ@n}Ny,@K>݋a@1rUnŰ@1y, @K  Re@MAIRGJ@ 'r Re@ț?inO $kϥac@inO $'` @i^3'-0"y, @K  Re@p!GJ@^oZ Re@B؄?j.Vkϥac@j.V'` @i^6'-0"y, @K  Re@۷-uGJ@ ; Re@tcA?ia|3?ia|݋a@d3"9_J@JfUJy,@K 9_J@1Aҡ@d3"Ny,@K>݋a@1rUnŰ@1Ny,@K>݋a@JfUrUnŰ@JfUy, @K  Re@̶}8f|@KnS Re@,?n UJk.m@n UJ'`T @h57r27'-0"Jy,@K >݋ah9_J%4fwJy,@K 9_J[ͣfoAҡhNy,@K>݋a%4fwrUnŰ%4fwNy,@K>݋a[ͣforUnŰ[ͣfoy, @K  Re}8f|[ ReCI'?n UJk.m@n UJ'`( @h57r27'-0"$@ 6#$ 3$@N