PROCEDURE Wall_WH; LABEL 999; CONST tGROUP=11; {グループ} vWallAverageHeight=616; {壁の平均高さ} pPrimShowUnitMark=163; {単位記号の表示(主単位)} OK_Button = 1; Cancel_Button = 2; VAR AL_name :STRING; W_num , i :INTEGER; Root_hd, TO_hd :HANDLE; 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; PROCEDURE Get_WallInfo(O_hd:HANDLE); BEGIN i:=i+1; 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; PROCEDURE Select_RootHandle(R_hd:HANDLE); LABEL 99; BEGIN 99: SetSelect(R_hd); R_hd:=GetParent(R_hd); { AlrtDIALOG(Num2StrF(GetType(R_hd)));} IF ( R_hd<>NIL ) & ( GetType(R_hd)=tGROUP ) THEN GOTO 99; END; FUNCTION Get_RootHandle(P_hd:HANDLE):HANDLE; LABEL 99; VAR O_hd :HANDLE; BEGIN Get_RootHandle:=P_hd; IF GetType(P_hd)=tGROUP THEN O_hd:=FInGroup(P_hd); 99:WHILE O_hd<>NIL DO BEGIN IF Selected(O_hd) THEN BEGIN Get_RootHandle:=O_hd; O_hd:=FInGroup(O_hd); GOTO 99; END; O_hd:=NextSObj(O_hd); END; END; BEGIN AL_name:=GetLName(ActLayer); W_num:=Count(( (T=Wall) & (L=AL_name) )); { IF AlertQuestion(Num2StrF(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]; DSelectAll; IF FSActLayer<>NIL THEN Root_hd:=Get_RootHandle(FSActLayer); SelectObj(( (L=AL_name) & (T=Wall) )); IF Root_hd=NIL THEN TO_hd:=FSActLayer ELSE TO_hd:=FInGroup(Root_hd); i:=0; WHILE TO_hd<>NIL DO BEGIN IF Selected(TO_hd) THEN Get_WallInfo(TO_hd); TO_hd:=NextSObj(TO_hd); END; W_num:=i; {グループが数に影響} { DSelectAll; グループをこえて働かない} DSelectObj(INVIEWPORT & ALL); IF Root_hd<>NIL THEN Select_RootHandle(Root_hd); {2回連続使用対策} ReDrawAll; 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);