PROCEDURE Wall_WH; LABEL 999; CONST vWallAverageHeight=616; {壁の平均高さ} objOptions=0; {All} travOptions=0; {Shallow} layerOptions=0; {Current} pPrimShowUnitMark=163; {単位記号の表示(主単位)} OK_Button = 1; Cancel_Button = 2; VAR AL_name :STRING; W_num, i :INTEGER; W_hd :DYNARRAY[] OF HANDLE; W_width :DYNARRAY[] OF REAL; W_height :DYNARRAY[] OF REAL; { thicknessDist, startHt, endHt :REAL; dd :BOOLEAN;} Show_UM :BOOLEAN; FUNCTION DIALOG_Wall(W_num:INTEGER; W_hd:DYNARRAY[] OF HANDLE; W_width, W_height:DYNARRAY[] OF REAL; AL_name:STRING):LONGINT; CONST iSW_St=3; SW_str='アクティブレイヤ上の壁'; St_width=10*2; iW_Gb=4; iH_Gb=5; iW_Cb=6; iH_Cb=7; iW_Lbn=8; iH_Lbn=9; Lbn_width=10; Lbn_height=5; VAR CW_num,CH_num, i :INTEGER; D_ID :LONGINT; PROCEDURE ReChoice_Wall(iW_Cb, iW_Lbn, CW_num, iH_Cb, iH_Lbn, CH_num:INTEGER); VAR i,SW_num :INTEGER; PROCEDURE Select_Wall(i:INTEGER; WT_str,WAH_str:STRING); VAR WT,WAH :REAL; WT_Res,WAH_Res :BOOLEAN; BEGIN { AlrtDialog(Concat('WT=',WT_str,',','WAH=',WAH_str));} WT_Res:=ValidNumStr(WT_str,WT); WAH_Res:=ValidNumStr(WAH_str,WAH); IF WT_Res & WAH_Res THEN BEGIN IF ( W_width[i]=WT ) & ( W_height[i]=WAH ) THEN SetSelect(W_hd[i]); END ELSE IF WT_Res THEN BEGIN IF W_width[i]=WT THEN SetSelect(W_hd[i]); END ELSE IF WAH_Res THEN BEGIN IF W_height[i]=WAH THEN SetSelect(W_hd[i]); END ELSE BEGIN SetSelect(W_hd[i]); END; END; PROCEDURE Choice_WallAverageHeight(i:INTEGER; WT_str:STRING); VAR j,CN :INTEGER; CS :STRING; BEGIN IF ItemSel(iH_Cb) THEN Select_Wall(i,WT_str,'All') ELSE BEGIN CN:=-1; FOR j:=1 TO CH_num DO BEGIN GetSelChoice(iH_Lbn,CN+1,CN,CS); IF CN<>-1 THEN Select_Wall(i,WT_str,CS) {-1=選択なし} ELSE j:=CH_num; END; END; END; PROCEDURE Choice_WallThickness(i:INTEGER); VAR j,CN :INTEGER; CS :STRING; BEGIN IF ItemSel(iW_Cb) THEN Choice_WallAverageHeight(i,'All') ELSE BEGIN CN:=-1; FOR j:=1 TO CW_num DO BEGIN GetSelChoice(iW_Lbn,CN+1,CN,CS); IF CN<>-1 THEN Choice_WallAverageHeight(i,CS) {-1=選択なし} ELSE j:=CW_num; END; END; END; BEGIN DSelectAll; FOR i:=1 TO W_num DO Choice_WallThickness(i); SW_num:=Count(( (T=Wall) & (L=AL_name) & (SEL=TRUE) )); IF SW_num<>0 THEN SetField(iSW_St,Concat('[ ',SW_num,' ]個の壁を選択')) ELSE SetField(iSW_St,SW_str); ReDrawAll; END; PROCEDURE HandleEvents( VAR item : LONGINT; data : LONGINT); PROCEDURE Reset_Lbn(iLbn, C_num:INTEGER); VAR i :INTEGER; BEGIN FOR i:=0 TO C_num-1 DO SelChoice(iLbn,i,FALSE) END; FUNCTION Sort_List(L_ID:INTEGER):INTEGER; VAR L_str :DYNARRAY[] OF STRING; i,j, L_num :INTEGER; BEGIN L_num:=NumChoices(L_ID); IF L_num>1 THEN BEGIN ALLOCATE L_str[1..L_num]; FOR i:=1 TO L_num DO BEGIN GetChoiceStr(L_ID,0,L_str[i]); DelChoice(L_ID,0); END; SortArray(L_str,L_num,0); j:=0; InsertChoice(L_ID,j,L_str[1]); FOR i:=2 TO L_num DO IF L_str[i]<>L_str[i-1] THEN BEGIN j:=j+1; InsertChoice(L_ID,j,L_str[i]); END; END; Sort_List:=NumChoices(L_ID); END; FUNCTION InsertChoice_Lbn(iLbn, L_num:INTEGER; List:DYNARRAY[] OF REAL):INTEGER; VAR i :INTEGER; BEGIN FOR i:=1 TO L_num DO InsertChoice(iLbn,0,Num2StrF(List[i])); InsertChoice_Lbn:=Sort_List(iLbn); END; BEGIN CASE item OF SetupDialogC: Begin SetItem(iW_Cb,FALSE); SetItem(iH_Cb,FALSE); CW_num:=InsertChoice_Lbn(iW_Lbn,W_num,W_width); CH_num:=InsertChoice_Lbn(iH_Lbn,W_num,W_height); END; iW_Cb,iH_Cb: BEGIN IF ItemSel(iW_Cb) THEN BEGIN ShowItem(D_ID,iW_Lbn,FALSE); Reset_Lbn(iW_Lbn,CW_num); END ELSE BEGIN ShowItem(D_ID,iW_Lbn,TRUE); END; IF ItemSel(iH_Cb) THEN BEGIN ShowItem(D_ID,iH_Lbn,FALSE); Reset_Lbn(iH_Lbn,CH_num); END ELSE BEGIN ShowItem(D_ID,iH_Lbn,TRUE); END; ReChoice_Wall(iW_Cb,iW_Lbn,CW_num,iH_Cb,iH_Lbn,CH_num); END; iW_Lbn,iH_Lbn: BEGIN ReChoice_Wall(iW_Cb,iW_Lbn,CW_num,iH_Cb,iH_Lbn,CH_num); END; END; END; BEGIN D_ID := CreateLayout('壁を選択',TRUE,'OK','キャンセル'); CreateStaticText (D_ID,iSW_St,SW_str,St_width); SetFirstLayoutItem (D_ID,iSW_St); CreateGroupBox (D_ID,iW_Gb,'壁の幅',FALSE); CreateGroupBox (D_ID,iH_Gb,'壁の高さ',FALSE); SetBelowItem (D_ID,iSW_St,iW_Gb,0,0); SetRightItem (D_ID,iW_Gb,iH_Gb,0,0); CreateCheckBox (D_ID,iW_Cb,'すべての厚み'); CreateCheckBox (D_ID,iH_Cb,'すべての高さ'); SetFirstGroupItem (D_ID,iW_Gb,iW_Cb); SetFirstGroupItem (D_ID,iH_Gb,iH_Cb); CreateListBoxN (D_ID,iW_Lbn,Lbn_width,Lbn_height,TRUE); SetBelowItem (D_ID,iW_Cb,iW_Lbn,0,0); SetHelpString (iW_Lbn,Concat('壁の厚みを選択',Chr(13),' 複数選択可能です')); CreateListBoxN (D_ID,iH_Lbn,Lbn_width,Lbn_height,TRUE); SetBelowItem (D_ID,iH_Cb,iH_Lbn,0,0); SetHelpString (iH_Lbn,Concat('壁の平均高さを選択',Chr(13),' 複数選択可能です')); IF VerifyLayout(D_ID) THEN DIALOG_Wall := RunLayoutDialog(D_ID,HandleEvents); END; FUNCTION Get_WallInfoF(O_hd:HANDLE):BOOLEAN; LABEL 99; CONST tWALL=68; {壁} BEGIN IF GetType(O_hd)=tWALL THEN BEGIN i:=i+1; IF i>W_num THEN BEGIN AlrtDialog('オブジェト数が異常です'); Get_WallInfoF:=TRUE; GOTO 99; END; W_hd[i]:=O_hd; { dd:=GetWallThickness(O_hd,thicknessDist);} W_width[i]:=WallWidth(O_hd); { WallHeight(O_hd,startHt,endHt); IF startHt=endHt THEN W_height[i]:=startHt ELSE W_height[i]:=-1;} W_height[i]:=GetObjectVariableReal(O_hd,vWallAverageHeight); { AlrtDialog(Concat(i,',',W_width[i],',',thicknessDist)); AlrtDialog(Concat(i,',',W_height[i],',',GetLinkHeightToLayerDeltaZ(O_hd),',',GetLayerDeltaZOffset(O_hd)));} END; Get_WallInfoF:=FALSE; 99:END; BEGIN DSelectAll; ReDrawAll; AL_name:=GetLName(ActLayer); W_num:=Count(( (T=Wall) & (L=AL_name) )); { IF AlertQuestion(Num2Str(0,W_num),'処理を続けますか?',1,'','','','')=0 THEN GOTO 999;} IF W_num<>0 THEN BEGIN ALLOCATE W_hd[1..W_num]; ALLOCATE W_width[1..W_num]; ALLOCATE W_height[1..W_num]; i:=0; ForEachObjectInLayer(Get_WallInfoF,objOptions,travOptions,layerOptions); W_num:=i; {グループが数に影響} Show_UM:=GetPref(pPrimShowUnitMark); IF Show_UM THEN SetPref(pPrimShowUnitMark,FALSE); IF DIALOG_Wall(W_num,W_hd,W_width,W_height,AL_name)=Cancel_Button THEN DSelectAll; SetPref(pPrimShowUnitMark,Show_UM); END ELSE AlrtDialog('「壁」が存在しません'); 999:END; Run(Wall_WH);