PROCEDURE Change_FontSet; LABEL 999; CONST {ForEachObjectInLayer} objOptions=2; {Selected} travOptions=0; {Shallow} layerOptions=0; {Current} tGROUP=11; {グループ} tViewPort=122; {ビューポート} vFontID=28; {寸法文字のフォント番号} vFontSize=17; {寸法値のフォントサイズ(mm)} in_pt=72; in_mm=25.4; FP_UserAppData=12; {注意:WinのUACによるファイルの仮想化} Folder_name='文字設定'; File_name='Font_List'; D_ID=32; OK_Button = 1; Cancel_Button = 2; iSO_Gb=3; iSO_St=4; iFS_Gb=5; iF_Cb=6; iS_Cb=7; iF_Pu=8; iS_Pu=9; iST_Sb=10; iRT_Sb=11; iHelp=12; FT_Static=1; BT_Standard=1; BT_AutoCheck=4; CT_PopUp=1; pTextFontName=100; {アクティブドキュメントのフォントの名前} VAR AL_name :STRING; TO_hd :HANDLE; i,op,oi, SO_num,S_num,G_num,T_num,D_num,PT_num,OO_num,GO_num :INTEGER; V_scale :REAL; GO_sta :BOOLEAN; SO_hd :DYNARRAY[] OF HANDLE; SO_scale :DYNARRAY[] OF REAL; DfontID :DYNARRAY[] OF INTEGER; Dsize :DYNARRAY[] OF REAL; vwMajor,vwMinor,vwMaintenance,platform :INTEGER; osMajor, osMinor, osIncr :LONGINT; File_Path,Path_Sepa :STRING; Item :INTEGER; Done :BOOLEAN; F_CN,S_CN :INTEGER; fontName,Ssize :STRING; PROCEDURE Set_FontSet(F_sw,S_sw:BOOLEAN; fontName:STRING; Size:STRING); BEGIN FOR i:=1 TO SO_num DO BEGIN IF F_sw THEN SetObjectVariableInt(SO_hd[i],vFontID,GetFontID(fontName)) ELSE SetObjectVariableInt(SO_hd[i],vFontID,DfontID[i]); IF S_sw THEN SetObjectVariableReal(SO_hd[i],vFontSize,Str2Num(Ssize)/in_pt*in_mm*SO_scale[i]) ELSE SetObjectVariableReal(SO_hd[i],vFontSize,Dsize[i]); ResetObject(SO_hd[i]); END; ReDrawAll; END; FUNCTION FileExists ( fileName :STRING ) : INTEGER; BEGIN UseDefaultFileErrorHandling ( FALSE ); Open ( fileName ); IF ( GetLastFileErr = 0 ) THEN BEGIN Close ( fileName ); END; UseDefaultFileErrorHandling ( TRUE ); FileExists := GetLastFileErr; END; FUNCTION Get_ObjectTypeF(O_hd:HANDLE):BOOLEAN; CONST tText=10; {文字列} tDIMENSION=63; {寸法線} tPLUGINOBJECT=86; {プラグインオブジェクト} vFontStyleEnabled=800; {フォントメニューの設定を利用する} PROCEDURE Get_FontSet(O_hd:HANDLE; V_scale:REAL); LABEL 99; BEGIN i:=i+1; IF i>SO_num THEN GOTO 99; SO_hd[i]:=O_hd; SO_scale[i]:=V_scale; DfontID[i]:=GetObjectVariableInt(O_hd,vFontID); Dsize[i]:=GetObjectVariableReal(O_hd,vFontSize); { IF i<>0 THEN BEGIN Message(SO_num,'=',i,' OT=',GetType(SO_hd[i]),' ',GetFontName(DfontID[i]),' ',Dsize[i]/in_mm*in_pt/SO_scale[i]); Wait(1); END;} 99:END; BEGIN IF Selected(O_hd) THEN {objOptionsがAllのため} BEGIN CASE GetType(O_hd) OF tTEXT: BEGIN T_num:=T_num+1; Get_FontSet(O_hd,V_scale); END; tDIMENSION: BEGIN D_num:=D_num+1; Get_FontSet(O_hd,V_scale); END; tPLUGINOBJECT: IF GetObjectVariableBoolean(O_hd,vFontStyleEnabled)=TRUE THEN BEGIN PT_num:=PT_num+1; Get_FontSet(O_hd,V_scale); END ELSE op:=op+1; OTHERWISE oi:=oi+1; END; IF GO_sta THEN GO_num:=GO_num+1; END; Get_ObjectTypeF:=FALSE; END; FUNCTION Get_GroupTypeF(TO_hd:HANDLE):BOOLEAN; CONST GT_Annotation=2; {ビューポート注釈} vVPScale=1003; {ビューポートの縮尺} {ForEachObjectInList} objOptions=0; {All:選択されていないグループ内も処理} travOptions=1; {Groups} VAR FL_hd :HANDLE; Res :BOOLEAN; BEGIN S_num:=S_num+1; CASE GetType(TO_hd) OF tViewPort: BEGIN G_num:=G_num+1; V_scale:=GetObjectVariableReal(TO_hd,vVPScale); GO_sta:=TRUE; FL_hd:=FInGroup(GetVPGroup(TO_hd,GT_Annotation)); IF FL_hd<>NIL THEN ForEachObjectInList(Get_ObjectTypeF,objOptions,travOptions,FL_hd); END; tGROUP: BEGIN G_num:=G_num+1; IF IsVPGroupContainedObject(TO_hd,GT_Annotation) THEN V_scale:=GetObjectVariableReal(FSActLayer,vVPScale) ELSE V_scale:=GetLScale(ActLayer); GO_sta:=TRUE; FL_hd:=FInGroup(TO_hd); IF FL_hd<>NIL THEN ForEachObjectInList(Get_ObjectTypeF,objOptions,travOptions,FL_hd); END; OTHERWISE BEGIN IF IsVPGroupContainedObject(TO_hd,GT_Annotation) THEN V_scale:=GetObjectVariableReal(FSActLayer,vVPScale) ELSE V_scale:=GetLScale(ActLayer); GO_sta:=FALSE; Res:=Get_ObjectTypeF(TO_hd); END; END; IF i>SO_num THEN BEGIN AlrtDialog('オブジェト数が異常です'); Get_GroupTypeF:=TRUE; END ELSE Get_GroupTypeF:=FALSE; END; BEGIN IF FSActLayer=NIL THEN BEGIN AlrtDialog('選択されているオブジェクトがありません'); GOTO 999; END ELSE BEGIN AL_name:=GetLName(ActLayer); SO_num:=Count(( INVIEWPORT & (SEL=TRUE) & (L=AL_name) & (T IN [TEXT,DIMENSION,PLUGINOBJECT]) )); IF SO_num>0 THEN BEGIN ALLOCATE SO_hd[1..SO_num]; ALLOCATE SO_scale[1..SO_num]; ALLOCATE DfontID[1..SO_num]; ALLOCATE Dsize[1..SO_num]; i:=0; op:=0; oi:=0; S_num:=0; G_num:=0; T_num:=0; D_num:=0; PT_num:=0; GO_num:=0; ForEachObjectInLayer(Get_GroupTypeF,objOptions,travOptions,layerOptions); {objOptions=Selectedでは、グループが選択されていないとグループ内は処理しない シートレイヤ上のビューポート内は処理しない travOptions=Groupsではカウントが難しい、トップビューのみを処理} IF NOT (SO_num=i+op) THEN CASE AlertQuestion(Concat('無選択のグループ内に[',SO_num-i-op,']の選択があります'),'レイヤ上で選択されていないグループ内の対象オブジェクトは処理されません',1,'','','','') OF 0: GOTO 999; 1: ; END; SO_num:=i; {グループの選択状態が数に影響} OO_num:=op+oi; END; IF SO_num=0 THEN BEGIN AlrtDialog('対象となるオブジェクトが選択されていません'); GOTO 999; END; END; Path_Sepa:='/'; { GetVersion(vwMajor,vwMinor,vwMaintenance,platform); GetOSVersion(osMajor, osMinor, osIncr); IF ( platform=1 ) & ( osMajor<9 ) THEN Path_Sepa:=':'; IF platform=2 THEN Path_Sepa:='\'; } File_Path:=concat(GetFolderPath(FP_UserAppData),'Plug-Ins',Path_Sepa,'DATA',Path_Sepa,Folder_name,Path_Sepa,File_name,'.txt'); BeginDialog(D_ID,1, 0, 0,270,340); SetTitle('文字設定'); AddGroupBox('選択中の対象オブジェクト',iSO_Gb, 10, 10,260,130); AddField(Concat('選択数=',S_num,' (選択グループ=',G_num,')',Chr(13),Chr(13), '処理対象=',SO_num,' 対象外=',OO_num,' (グループ内=',GO_num,')',Chr(13),Chr(13), '文字列=',T_num,Chr(13), '寸法線=',D_num,Chr(13), '対象のプラグインオブジェクト=',PT_num) ,iSO_St,FT_Static, 20, 30,250,120); AddGroupBox('変更する項目を選択',iFS_Gb, 10,140,260,210); AddButton('フォント',iF_Cb,BT_AutoCheck, 30,160,130,175); AddButton('サイズ(ポイント)',iS_Cb,BT_AutoCheck, 140,160,240,175); AddChoiceItem('FONT',iF_Pu,CT_PopUp, 30,180,130,200); AddChoiceItem('SIZE',iS_Pu,CT_PopUp, 140,180,240,200); AddButton('プレビュー',iST_Sb,BT_Standard, 10,220, 90,240); AddButton('元に戻す',iRT_Sb,BT_Standard, 100,220,180,240); AddHelpItem(iHelp, 10,250,260,300); AddButton('OK',OK_Button,BT_Standard, 90,310,170,330); AddButton('キャンセル',Cancel_Button,BT_Standard, 180,310,260,330); EndDialog; Done:=FALSE; GetDialog(D_ID); {SetItem(iF_Cb,FALSE); SetItem(iS_Cb,FALSE);} SetItemEnable(iF_Pu,ItemSel(iF_Cb)); SetItemEnable(iS_Pu,ItemSel(iS_Cb)); IF FileExists(File_Path)<>0 THEN BEGIN fontName:=GetPrefString(pTextFontName); InsertChoice(iF_Pu,1,fontName); AlertCritical('フォントリストが保存されていません',Concat('あらかじめ「デフォルト文字設定」ツールで',Chr(13),'使用するフォントを追加してください')); END ELSE BEGIN Open(File_Path); i:=1; WHILE NOT EOF(File_Path) DO BEGIN ReadLn(fontName); InsertChoice(iF_Pu,i,fontName); i:=i+1; END; Close(File_Path); END; {4,6,7,9,72,96,144} InsertChoice(iS_Pu,1,'8'); InsertChoice(iS_Pu,2,'10'); InsertChoice(iS_Pu,3,'12'); InsertChoice(iS_Pu,4,'14'); InsertChoice(iS_Pu,5,'18'); InsertChoice(iS_Pu,6,'20'); InsertChoice(iS_Pu,7,'24'); InsertChoice(iS_Pu,8,'28'); InsertChoice(iS_Pu,9,'36'); InsertChoice(iS_Pu,10,'48'); SetHelpString(iST_Sb,'プラグインオブジェクトは更新されないので注意してください'); SetHelpString(OK_Button,'グループ内のオブジェクトは選択状態にしたがって処理されます'); REPEAT DialogEvent(Item); CASE Item OF OK_Button: BEGIN Done:=TRUE; GetSelChoice(iF_Pu,1,F_CN,fontName); GetSelChoice(iS_Pu,1,S_CN,Ssize); Set_FontSet(ItemSel(iF_Cb),ItemSel(iS_Cb),fontName,Ssize); END; Cancel_Button: BEGIN Done:=TRUE; Set_FontSet(FALSE,FALSE,fontName,Ssize); END; iF_Cb: SetItemEnable(iF_Pu,ItemSel(iF_Cb)); iS_Cb: SetItemEnable(iS_Pu,ItemSel(iS_Cb)); iST_Sb: BEGIN GetSelChoice(iF_Pu,1,F_CN,fontName); GetSelChoice(iS_Pu,1,S_CN,Ssize); Set_FontSet(ItemSel(iF_Cb),ItemSel(iS_Cb),fontName,Ssize); END; iRT_Sb: Set_FontSet(FALSE,FALSE,fontName,Ssize); END; UNTIL Done; ClrDialog; 999:END; RUN(Change_FontSet);