PROCEDURE Select_TextObject; LABEL 99,999; CONST GT_Annotation=2; {ビューポート注釈} tTEXT=10; {文字列} tGROUP=11; {グループ} tDIMENSION=63; {寸法線} tPLUGINOBJECT=86; {プラグインオブジェクト} tViewPort=122; {ビューポート} PT_max=30; {大きく取るとエラー} G_max=100; OK_Button = 1; Cancel_Button = 2; VAR AL_name :STRING; VPG_hd,Root_hd,TO_hd :HANDLE; ST_num,P_num,G_num, T_num,D_num,PT_num, i,g,t,d,pt, so,sg,gt,gd,gpt :INTEGER; ST_hd :DYNARRAY[] OF HANDLE; PT_name :DYNARRAY[] OF STRING; G_sw :DYNARRAY[] OF INTEGER; G_hd :DYNARRAY[] OF HANDLE; C_name :DYNARRAY[] OF STRING; FUNCTION Sort_Array(before:DYNARRAY[] OF STRING; num:INTEGER; VAR after:DYNARRAY[] OF STRING):INTEGER; VAR i,j :INTEGER; BEGIN SortArray(before,num,0); j:=1; after[j]:=before[1]; IF num>=2 THEN FOR i:=2 TO num DO IF before[i]<>after[j] THEN BEGIN j:=j+1; after[j]:=before[i]; END; Sort_Array:=j; END; FUNCTION DIALOG_ST(VAR so,sg,gt,gd,gpt:INTEGER):LONGINT; CONST iST_Gb=3; iT_Gb=4; iT_Cb=10; iTG_St=11; iTV_St=12; iD_Gb=5; iD_Cb=20; {+5} iDG_St=30; {+5} iDV_St=40; {+5} iPT_Gb=6; iPT_Cb=50; {+PT_max} iPTG_St=100; {+PT_max} iPTV_St=150; {+PT_max} iG_Gb=7; iG_Cb=200; {+G_max} iG_s=15; iC_Gb=8; iC_Lbn=16; G_str='InGroup'; V_str='InViewPort'; St_width=-1; {auto} iLength=1; {適当で位置揃え} Lbn_width=12; Lbn_height=6; AE_Right=1; {Alignment Options} AE_Bottom=2; AM_Resize=0; AM_Shift=1; vDimensionType=26; {寸法の種類} VAR D_ID :LONGINT; i,j, PTN_num,CN_num :INTEGER; G_name :STRING; PROCEDURE ReChoice_T(VAR so,sg,gt,gd,gpt:INTEGER); VAR i :INTEGER; PROCEDURE Select_T(i:INTEGER; VAR st,sd,spt:INTEGER); VAR j :INTEGER; FUNCTION Select_PT(i:INTEGER):BOOLEAN; VAR j :INTEGER; BEGIN FOR j:=1 TO PTN_num DO IF GetName(GetRecord(ST_hd[i],1))=PT_name[j] THEN IF ItemSel(iPT_Cb+j) THEN BEGIN SetSelect(ST_hd[i]); Select_PT:=TRUE; END ELSE Select_PT:=FALSE; END; BEGIN CASE GetType(ST_hd[i]) OF tTEXT: IF ItemSel(iT_Cb) THEN BEGIN SetSelect(ST_hd[i]); st:=st+1; END; tDIMENSION: FOR j:=0 TO 5 DO IF ( GetObjectVariableInt(ST_hd[i],vDimensionType)=j ) & ItemSel(iD_Cb+j) THEN BEGIN SetSelect(ST_hd[i]); sd:=sd+1; END; tPLUGINOBJECT: IF Select_PT(i) THEN spt:=spt+1; END; END; PROCEDURE Choice_C(i:INTEGER; VAR st,sd,spt:INTEGER); VAR j,CN :INTEGER; CS :STRING; BEGIN CN:=-1; FOR j:=1 TO CN_num DO BEGIN GetSelChoice(iC_Lbn,CN+1,CN,CS); IF CN<>-1 THEN {-1=選択なし} BEGIN IF C_name[i]=CS THEN Select_T(i,st,sd,spt); END ELSE j:=CN_num; END; END; PROCEDURE Choice_G(i:INTEGER; VAR so,sg,gt,gd,gpt:INTEGER); VAR st,sd,spt :INTEGER; BEGIN IF ItemSel(iG_Cb+G_sw[i]) THEN BEGIN st:=0; sd:=0; spt:=0; Choice_C(i,st,sd,spt); IF G_sw[i]=0 THEN so:=so+st+sd+spt ELSE BEGIN gt:=gt+st; gd:=gd+sd; gpt:=gpt+spt; IF ( st+sd+spt>0 ) & ( NOT Selected(G_hd[G_sw[i]]) ) THEN BEGIN SetSelect(G_hd[G_sw[i]]); sg:=sg+1; END; END; END; END; BEGIN DSelectAll; {シートレイヤ上からビューポート注釈内を解除できない、グループを解除} FOR i:=1 TO ST_num DO BEGIN SetDSelect(ST_hd[i]); Choice_G(i,so,sg,gt,gd,gpt); END; so:=so+sg; ReDrawAll; END; PROCEDURE HandleEvents( VAR item : LONGINT; data : LONGINT); 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; BEGIN CASE item OF SetupDialogC: BEGIN IF T_num=0 THEN SetItemEnable(iT_Gb,FALSE); IF D_num=0 THEN SetItemEnable(iD_Gb,FALSE); IF PT_num=0 THEN SetItemEnable(iPT_Gb,FALSE); SetItemEnable(iTG_St,FALSE); SetItemEnable(iTV_St,FALSE); FOR i:=0 TO 5 DO BEGIN SetItemEnable(iD_Cb+i,FALSE); SetItemEnable(iDG_St+i,FALSE); SetItemEnable(iDV_St+i,FALSE); END; FOR i:=1 TO PTN_num DO BEGIN SetItemEnable(iPTG_St+i,FALSE); SetItemEnable(iPTV_St+i,FALSE); END; FOR i:=1 TO ST_num DO BEGIN IF GetType(ST_hd[i])=tDIMENSION THEN FOR j:=0 TO 5 DO IF GetObjectVariableInt(ST_hd[i],vDimensionType)=j THEN SetItemEnable(iD_Cb+j,TRUE); IF G_sw[i]>0 THEN CASE GetType(ST_hd[i]) OF tTEXT: CASE GetType(G_hd[G_sw[i]]) OF tGROUP: SetItemEnable(iTG_St,TRUE); tViewPort: SetItemEnable(iTV_St,TRUE); END; tDIMENSION: FOR j:=0 TO 5 DO IF GetObjectVariableInt(ST_hd[i],vDimensionType)=j THEN CASE GetType(G_hd[G_sw[i]]) OF tGROUP: SetItemEnable(iDG_St+j,TRUE); tViewPort: SetItemEnable(iDV_St+j,TRUE); END; tPLUGINOBJECT: FOR j:=1 TO PTN_num DO IF GetName(GetRecord(ST_hd[i],1))=PT_name[j] THEN CASE GetType(G_hd[G_sw[i]]) OF tGROUP: SetItemEnable(iPTG_St+j,TRUE); tViewPort: SetItemEnable(iPTV_St+j,TRUE); END; END; END; SetItem(iG_Cb,TRUE); IF G_num=0 THEN SetItemEnable(iG_Gb,FALSE); FOR i:=1 TO ST_num DO InsertChoice(iC_Lbn,i-1,GetClass(ST_hd[i])); CN_num:=Sort_List(iC_Lbn); FOR i:=1 TO CN_num DO SelChoice(iC_Lbn,i-1,TRUE); END; iT_Cb, iD_Cb..iD_Cb+5, iC_Lbn, iPT_Cb+1..iPT_Cb+PT_max, iG_Cb..iG_Cb+G_max: BEGIN so:=0; sg:=0; gt:=0; gd:=0; gpt:=0; ReChoice_T(so,sg,gt,gd,gpt); END; END; END; BEGIN D_ID := CreateLayout('選択−文字系',TRUE,'OK','キャンセル'); CreateGroupBox (D_ID,iST_Gb,'アクティブレイヤ上の文字系オブジェクト',TRUE); SetFirstLayoutItem (D_ID,iST_Gb); CreateGroupBox (D_ID,iT_Gb,'文字列',TRUE); SetFirstGroupItem (D_ID,iST_Gb,iT_Gb); AlignItemEdge (D_ID,iT_Gb,AE_Right,iST_Gb,AM_Resize); CreateGroupBox (D_ID,iD_Gb,'寸法線',TRUE); SetBelowItem (D_ID,iT_Gb,iD_Gb,0,0); AlignItemEdge (D_ID,iD_Gb,AE_Right,iST_Gb,AM_Resize); CreateGroupBox (D_ID,iPT_Gb,'フォントメニューの設定を利用するプラグインオブジェクト',TRUE); SetBelowItem (D_ID,iD_Gb,iPT_Gb,0,0); AlignItemEdge (D_ID,iPT_Gb,AE_Right,iST_Gb,AM_Resize); CreateGroupBox (D_ID,iG_Gb,'グループ内も選択',TRUE); SetBelowItem (D_ID,iPT_Gb,iG_Gb,0,0); AlignItemEdge (D_ID,iG_Gb,AE_Bottom,iG_Gb,AM_Resize); CreateGroupBox (D_ID,iC_Gb,'クラスごとに選択',TRUE); SetRightItem (D_ID,iG_Gb,iC_Gb,0,0); AlignItemEdge (D_ID,iC_Gb,AE_Bottom,iG_Gb,AM_Resize); CreateCheckBox (D_ID,iT_Cb,''); SetFirstGroupItem (D_ID,iT_Gb,iT_Cb); CreateStaticText (D_ID,iTG_St,G_str,St_width); SetRightItem (D_ID,iT_Cb,iTG_St,0,0); AlignItemEdge (D_ID,iTG_St,AE_Right,iTG_St,AM_Shift); CreateStaticText (D_ID,iTV_St,V_str,St_width); SetRightItem (D_ID,iTG_St,iTV_St,0,0); AlignItemEdge (D_ID,iTV_St,AE_Right,iTV_St,AM_Shift); CreateCheckBox (D_ID,iD_Cb,'縦横寸法'); SetFirstGroupItem (D_ID,iD_Gb,iD_Cb); CreateStaticText (D_ID,iDG_St,G_str,St_width); SetRightItem (D_ID,iD_Cb,iDG_St,0,0); AlignItemEdge (D_ID,iDG_St,AE_Right,iTG_St,AM_Shift); CreateStaticText (D_ID,iDV_St,V_str,St_width); SetRightItem (D_ID,iDG_St,iDV_St,0,0); AlignItemEdge (D_ID,iDV_St,AE_Right,iTV_St,AM_Shift); CreateCheckBox (D_ID,iD_Cb+1,'斜め寸法'); SetBelowItem (D_ID,iD_Cb,iD_Cb+1,0,0); CreateStaticText (D_ID,iDG_St+1,G_str,St_width); SetRightItem (D_ID,iD_Cb+1,iDG_St+1,0,0); AlignItemEdge (D_ID,iDG_St+1,AE_Right,iTG_St,AM_Shift); CreateStaticText (D_ID,iDV_St+1,V_str,St_width); SetRightItem (D_ID,iDG_St+1,iDV_St+1,0,0); AlignItemEdge (D_ID,iDV_St+1,AE_Right,iTV_St,AM_Shift); CreateCheckBox (D_ID,iD_Cb+2,'累進寸法'); SetBelowItem (D_ID,iD_Cb+1,iD_Cb+2,0,0); CreateStaticText (D_ID,iDG_St+2,G_str,St_width); SetRightItem (D_ID,iD_Cb+2,iDG_St+2,0,0); AlignItemEdge (D_ID,iDG_St+2,AE_Right,iTG_St,AM_Shift); CreateStaticText (D_ID,iDV_St+2,V_str,St_width); SetRightItem (D_ID,iDG_St+2,iDV_St+2,0,0); AlignItemEdge (D_ID,iDV_St+2,AE_Right,iTV_St,AM_Shift); CreateCheckBox (D_ID,iD_Cb+3,'半径寸法'); SetBelowItem (D_ID,iD_Cb+2,iD_Cb+3,0,0); CreateStaticText (D_ID,iDG_St+3,G_str,St_width); SetRightItem (D_ID,iD_Cb+3,iDG_St+3,0,0); AlignItemEdge (D_ID,iDG_St+3,AE_Right,iTG_St,AM_Shift); CreateStaticText (D_ID,iDV_St+3,V_str,St_width); SetRightItem (D_ID,iDG_St+3,iDV_St+3,0,0); AlignItemEdge (D_ID,iDV_St+3,AE_Right,iTV_St,AM_Shift); CreateCheckBox (D_ID,iD_Cb+4,'直径寸法'); SetBelowItem (D_ID,iD_Cb+3,iD_Cb+4,0,0); CreateStaticText (D_ID,iDG_St+4,G_str,St_width); SetRightItem (D_ID,iD_Cb+4,iDG_St+4,0,0); AlignItemEdge (D_ID,iDG_St+4,AE_Right,iTG_St,AM_Shift); CreateStaticText (D_ID,iDV_St+4,V_str,St_width); SetRightItem (D_ID,iDG_St+4,iDV_St+4,0,0); AlignItemEdge (D_ID,iDV_St+4,AE_Right,iTV_St,AM_Shift); CreateCheckBox (D_ID,iD_Cb+5,'角度寸法'); SetBelowItem (D_ID,iD_Cb+4,iD_Cb+5,0,0); CreateStaticText (D_ID,iDG_St+5,G_str,St_width); SetRightItem (D_ID,iD_Cb+5,iDG_St+5,0,0); AlignItemEdge (D_ID,iDG_St+5,AE_Right,iTG_St,AM_Shift); CreateStaticText (D_ID,iDV_St+5,V_str,St_width); SetRightItem (D_ID,iDG_St+5,iDV_St+5,0,0); AlignItemEdge (D_ID,iDV_St+5,AE_Right,iTV_St,AM_Shift); IF PT_num<>0 THEN BEGIN PTN_num:=Sort_Array(PT_name,PT_num,PT_name); FOR i:=1 TO PTN_num DO BEGIN CreateCheckBox (D_ID,iPT_Cb+i,PT_name[i]); IF i=1 THEN SetFirstGroupItem (D_ID,iPT_Gb,iPT_Cb+i) ELSE SetBelowItem (D_ID,iPT_Cb+i-1,iPT_Cb+i,0,0); CreateStaticText (D_ID,iPTG_St+i,G_str,St_width); SetRightItem (D_ID,iPT_Cb+i,iPTG_St+i,0,0); AlignItemEdge (D_ID,iPTG_St+i,AE_Right,iTG_St,AM_Shift); CreateStaticText (D_ID,iPTV_St+i,V_str,St_width); SetRightItem (D_ID,iPTG_St+i,iPTV_St+i,0,0); AlignItemEdge (D_ID,iPTV_St+i,AE_Right,iTV_St,AM_Shift); END; END; CreateCheckBox (D_ID,iG_Cb,'グループ外'); SetFirstGroupItem (D_ID,iG_Gb,iG_Cb); AlignItemEdge (D_ID,iG_Cb,AE_right,iG_Gb,AM_Resize); CreateSeparator (D_ID,iG_s,iLength); SetBelowItem (D_ID,iG_Cb,iG_s,0,0); AlignItemEdge (D_ID,iG_s,AE_right,iG_Gb,AM_Resize); IF G_num<>0 THEN BEGIN j:=0; FOR i:=1 TO G_num DO BEGIN IF GetType(G_hd[i])=tViewPort THEN G_name:=GetName(G_hd[i]) ELSE BEGIN j:=j+1; G_name:=Concat('グループ-',j); END; CreateCheckBox (D_ID,iG_Cb+i,G_name); IF i=1 THEN SetBelowItem (D_ID,iG_s,iG_Cb+i,0,0) ELSE SetBelowItem (D_ID,iG_Cb+i-1,iG_Cb+i,0,0); SetHelpString (iG_Cb+i,'グループ内のオブジェクトは選別されます'); END; END; CreateListBoxN (D_ID,iC_Lbn,Lbn_width,Lbn_height,TRUE); SetFirstGroupItem (D_ID,iC_Gb,iC_Lbn); SetHelpString(iC_Lbn,'クラスを選択 複数選択可能'); IF VerifyLayout(D_ID) THEN Dialog_ST:=RunLayoutDialog(D_ID,HandleEvents); END; { PROCEDURE Document_Class; BEGIN DC_num:=ClassNum; ALLOCATE DC_name[1..DC_num]; j:=0; FOR i:=1 TO DC_num DO BEGIN IF Pos('寸法',ClassList(i))<>0 THEN BEGIN j:=j+1; DC_name[j]:=ClassList(i); END; END; DC_num:=j; END; } PROCEDURE Get_ObjectType(O_hd:HANDLE; G_sta:INTEGER; VAR t,d,pt:INTEGER); CONST vFontStyleEnabled=800; {フォントメニューの設定を利用する} PROCEDURE Get_TextObject(O_hd:HANDLE; G_sta:INTEGER); LABEL 99; BEGIN i:=i+1; IF i>ST_num THEN GOTO 99; ST_hd[i]:=O_hd; C_name[i]:=GetClass(O_hd); G_sw[i]:=G_sta; { IF i<>0 THEN BEGIN Message(ST_num,'=',i,' OT=',GetType(ST_hd[i]),' ',C_name[i],' ',G_sw[i]); Wait(1); END;} 99:END; BEGIN CASE GetType(O_hd) OF tTEXT: BEGIN Get_TextObject(O_hd,G_sta); t:=t+1; END; tDIMENSION: BEGIN Get_TextObject(O_hd,G_sta); d:=d+1; END; tPLUGINOBJECT: BEGIN IF GetObjectVariableBoolean(O_hd,vFontStyleEnabled)=TRUE THEN BEGIN Get_TextObject(O_hd,G_sta); pt:=pt+1; PT_name[pt]:=GetName(GetRecord(O_hd,1)); END; END; END; END; PROCEDURE Get_GroupObject(G_hd:HANDLE; g:INTEGER; VAR t,d,pt:INTEGER); VAR GO_hd:HANDLE; BEGIN GO_hd:=FInGroup(G_hd); WHILE GO_hd<>NIL DO BEGIN IF Selected(GO_hd) THEN CASE GetType(GO_hd) OF tGROUP: Get_GroupObject(GO_hd,g,t,d,pt); OTHERWISE Get_ObjectType(GO_hd,g,t,d,pt); END; GO_hd:=NextSObj(GO_hd); END; END; PROCEDURE Select_RootHandle(R_hd:HANDLE); LABEL 99; BEGIN 99: SetSelect(R_hd); R_hd:=GetParent(R_hd); { AlrtDIALOG(Num2Str(0,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 CASE GetType(P_hd) OF tViewPort: O_hd:=GetVPGroup(P_hd,GT_Annotation); tGROUP: O_hd:=P_hd; OTHERWISE ; END; Get_RootHandle:=O_hd; IF GetType(O_hd)=tGROUP THEN O_hd:=FInGroup(O_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); ST_num:=Count( INVIEWPORT & (L=AL_name) & (T IN [TEXT,DIMENSION,PLUGINOBJECT]) ); IF ST_num>0 THEN BEGIN ALLOCATE ST_hd[1..ST_num]; ALLOCATE C_name[1..ST_num]; ALLOCATE G_sw[1..ST_num]; END; P_num:=Count( INVIEWPORT & (L=AL_name) & (T=PLUGINOBJECT) ); IF P_num>0 THEN ALLOCATE PT_name[1..P_num]; G_num:=Count( INVIEWPORT & (L=AL_name) & ( (T=GROUP) | (ST=REGVIEWPORT) ) ); IF G_num>0 THEN ALLOCATE G_hd[1..G_num]; DSelectAll; IF FSActLayer<>NIL THEN BEGIN VPG_hd:=FSActLayer; Root_hd:=Get_RootHandle(VPG_hd); END; SelectObj( INVIEWPORT & (L=AL_name) & ( (T IN [TEXT,DIMENSION,PLUGINOBJECT,GROUP]) | (ST=REGVIEWPORT) ) ); IF Root_hd=NIL THEN TO_hd:=FSActLayer ELSE TO_hd:=FInGroup(Root_hd); { AlrtDialog(Concat(GetType(Root_hd),',',GetType(TO_hd)));} i:=0; g:=0; t:=0; d:=0; pt:=0; WHILE TO_hd<>NIL DO BEGIN IF Selected(TO_hd) THEN {グループ内1つ目対策} CASE GetType(TO_hd) OF tViewPort: BEGIN g:=g+1; G_hd[g]:=TO_hd; {FOR FEOIL} Get_GroupObject(GetVPGroup(TO_hd,GT_Annotation),g,t,d,pt); END; tGROUP: BEGIN g:=g+1; G_hd[g]:=TO_hd; {FOR FEOIL} Get_GroupObject(TO_hd,g,t,d,pt); END; OTHERWISE Get_ObjectType(TO_hd,0,t,d,pt); END; TO_hd:=NextSObj(TO_hd); END; { DSelectAll; グループをこえて働かない} DSelectObj(INVIEWPORT & ALL); IF VPG_hd<>NIL THEN SetSelect(VPG_hd); {2回連続使用対策} IF Root_hd<>NIL THEN Select_RootHandle(Root_hd); ReDrawAll; { AlrtDialog(Concat(ST_num,',',G_num,',',T_num,',',D_num,',',P_num)); AlrtDialog(Concat(i,',',g,',',t,',',d,',',pt));} ST_num:=i; G_num:=g; T_num:=t; D_num:=d; PT_num:=pt; {グループが数に影響} IF ST_num=0 THEN BEGIN AlrtDialog('対象となるオブジェクトがありません'); GOTO 999; END; IF PT_num>PT_max THEN BEGIN AlertCritical('スクリプトを修正する必要があります','設定値を超えるプラグインオブジェクトが見つかりました'); GOTO 999; END; IF G_num>G_max THEN BEGIN AlertCritical('スクリプトを修正する必要があります','設定値を超えるグループが見つかりました'); GOTO 999; END; IF DIALOG_ST(so,sg,gt,gd,gpt)=OK_Button THEN BEGIN Message('選択数(グループ)=',so,'(',sg,')', ' 文字列=',Count(( INVIEWPORT & (L=AL_name) & (T=Text) & (SEL=TRUE) )),'(',gt,')', ' 寸法線=',Count(( INVIEWPORT & (L=AL_name) & (T=DIMENSION) & (SEL=TRUE) )),'(',gd,')', ' プラグインオブジェクト=',Count(( INVIEWPORT & (L=AL_name) & (T=PLUGINOBJECT) & (SEL=TRUE) )),'(',gpt,')'); END ELSE BEGIN DSelectAll; {シートレイヤ上からビューポート注釈内を解除できない、グループを解除} FOR i:=1 TO ST_num DO SetDSelect(ST_hd[i]); END; 999:END; Run(Select_TextObject);