PROCEDURE Change_Dimension; LABEL 999; CONST {ForEachObjectInLayer} objOptions=2; {Selected} travOptions=0; {Shallow} layerOptions=0; {Current} vShowOnlyPrim=32; {主単位のみ} vShowOnlySecond=33; {補助単位のみ} vPrimDimPrecision=20; {精度(主単位)} vSecondDimPrecision=21; {精度(補助単位)} vShowPrimDimText=6; {寸法値の表示(主単位)} vShowSecondDimText=23; {寸法値の表示(補助単位)} vPrimLeadText=9; {前記号(主単位)} vPrimTrailText=10; {後記号(主単位)} vSecondLeadText=24; {前記号(補助単位)} vSecondTrailText=25; {後記号(補助単位)} P_adjust=' '; Max_DP=10; S_adjust=' '; VAR AL_name :STRING; TO_hd :HANDLE; i,D_num :INTEGER; D_hd :DYNARRAY[] OF HANDLE; FUNCTION Prim_Comma(s:STRING):STRING; VAR i :INTEGER; BEGIN i := Pos ( '.', s ); IF i = 0 THEN BEGIN i := Len ( s ) + 1; END; WHILE i > 4 DO BEGIN i := i - 3; Insert ( ',', s, i ); END; Prim_Comma:=s; END; PROCEDURE Set_Prim_Kuraidori(O_hd:HANDLE; Cb:BOOLEAN); VAR dt,lt :STRING; i :INTEGER; BEGIN dt:=Prim_Comma(GetDimText(O_hd)); lt:=GetObjectVariableString(O_hd,vPrimLeadText); i:=Pos(dt,lt); IF Cb & ( i=0 ) THEN BEGIN SetObjectVariableString(O_hd,vPrimLeadText,Concat(lt,dt,P_adjust)); SetObjectVariableBoolean(O_hd,vShowPrimDimText,FALSE); ResetObject(O_hd); END; IF ( NOT Cb ) & ( i<>0 ) THEN BEGIN Delete(lt,i,Len(dt)); i:=Pos(P_adjust,lt); IF i<>0 THEN Delete(lt,i,Len(P_adjust)); SetObjectVariableString(O_hd,vPrimLeadText,lt); SetObjectVariableBoolean(O_hd,vShowPrimDimText,TRUE); ResetObject(O_hd); END; END; FUNCTION Get_Prim_Kuraidori(O_hd:HANDLE):BOOLEAN; VAR dt,lt :STRING; i :INTEGER; BEGIN dt:=Prim_Comma(GetDimText(O_hd)); lt:=GetObjectVariableString(O_hd,vPrimLeadText); i:=Pos(dt,lt); IF i=0 THEN Get_Prim_Kuraidori:=FALSE ELSE Get_Prim_Kuraidori:=TRUE; END; FUNCTION Second_Comma(dp:INTEGER; s:STRING):STRING; CONST pPrimUnitsPerInch=152; {単位/インチ(主単位)} pPrimUnitMark=154; {単位記号(主単位)} pSecondUnitsPerInch=202; {単位/インチ(補助単位)} pSecondUnitMark=204; {単位記号(補助単位)} pSecondShowUnitMark=213; {単位記号の表示(補助単位)} pSecondDisplayTrailZero=215; {有効桁数の0を表示(補助単位)} VAR um :STRING; i :INTEGER; BEGIN um:=GetPrefString(pPrimUnitMark); i:=Pos(um,s); IF i<>0 THEN Delete(s,i,Len(um)); IF dp>9 THEN dp:=9; {decPlace has a range of -1 to 9} s:=Num2Str(dp,Str2Num(s)/GetPrefReal(pPrimUnitsPerInch)*GetPrefReal(pSecondUnitsPerInch)); IF ( NOT GetPref(pSecondDisplayTrailZero) ) & ( Pos('.',s)<>0 )THEN BEGIN WHILE Copy(s,Len(s),1)='0' DO Delete(s,Len(s),1); IF Copy(s,Len(s),1)='.' THEN Delete(s,Len(s),1); END; i := Pos ( '.', s ); IF i = 0 THEN BEGIN i := Len ( s ) + 1; END; WHILE i > 4 DO BEGIN i := i - 3; Insert ( ',', s, i ); END; IF GetPref(pSecondShowUnitMark) THEN s:=Concat(s,GetPrefString(pSecondUnitMark)); Second_comma:=s; END; PROCEDURE Set_Second_Kuraidori(O_hd:HANDLE; Cb:BOOLEAN); VAR dt,lt :STRING; i,bp :INTEGER; BEGIN bp:=GetObjectVariableLongint(O_hd,vPrimDimPrecision); SetObjectVariableLongint(O_hd,vPrimDimPrecision,Max_DP); {変換誤差対策、最高精度で取得} dt:=Second_comma(GetObjectVariableLongint(O_hd,vSecondDimPrecision),GetDimText(O_hd)); SetObjectVariableLongint(O_hd,vPrimDimPrecision,bp); lt:=GetObjectVariableString(O_hd,vSecondLeadText); i:=Pos(dt,lt); IF Cb & ( i=0 ) THEN BEGIN SetObjectVariableString(O_hd,vSecondLeadText,Concat(S_adjust,lt,dt)); SetObjectVariableBoolean(O_hd,vShowSecondDimText,FALSE); ResetObject(O_hd); END; IF ( NOT Cb ) & ( i<>0 ) THEN BEGIN Delete(lt,i,Len(dt)); i:=Pos(S_adjust,lt); IF i<>0 THEN Delete(lt,i,Len(S_adjust)); SetObjectVariableString(O_hd,vSecondLeadText,lt); SetObjectVariableBoolean(O_hd,vShowSecondDimText,TRUE); ResetObject(O_hd); END; END; FUNCTION Get_Second_Kuraidori(O_hd:HANDLE):BOOLEAN; VAR dt,lt :STRING; i,bp :INTEGER; BEGIN bp:=GetObjectVariableLongint(O_hd,vPrimDimPrecision); SetObjectVariableLongint(O_hd,vPrimDimPrecision,Max_DP); {変換誤差対策、最高精度で取得} dt:=Second_comma(GetObjectVariableLongint(O_hd,vSecondDimPrecision),GetDimText(O_hd)); SetObjectVariableLongint(O_hd,vPrimDimPrecision,bp); lt:=GetObjectVariableString(O_hd,vSecondLeadText); i:=Pos(dt,lt); IF i=0 THEN Get_Second_Kuraidori:=FALSE ELSE Get_Second_Kuraidori:=TRUE; END; PROCEDURE DIALOG_Dimension; CONST iMS_Gb=3; iM_Rb=30; iS_Rb=31; iP_Pb=4; iN_Pb=5; iSO_St=6; iSO_Pdm=7; iSO_s=8; iPS_Gb=9; iPD_Rb=40; iSD_Rb=41; iDP_St=10; iDP_Pdm=11; iST_Cb=12; iLT_St=13; iLT_Et=14; iTT_St=15; iTT_Et=16; iK_s=17; iK_Cb=18; St_width=-1; {auto} Pdm_width=18; iLength=1; {適当で位置揃え} AE_Right=1; {Alignment Options} AM_Resize=0; AM_Shift=1; VAR D_ID,D_Res :LONGINT; ii :INTEGER; {keep} BOX_hd :HANDLE; {keep} PROCEDURE HandleEvents( VAR item : LONGINT; data : LONGINT); VAR CN :INTEGER; CS :STRING; PROCEDURE Change_Et(i:INTEGER; LT,TT:STRING); BEGIN IF ItemSel(iPD_Rb) THEN BEGIN SetObjectVariableString(D_hd[i],vPrimLeadText,LT); SetObjectVariableString(D_hd[i],vPrimTrailText,TT); END; IF ItemSel(iSD_Rb) THEN BEGIN SetObjectVariableString(D_hd[i],vSecondLeadText,LT); SetObjectVariableString(D_hd[i],vSecondTrailText,TT); END; ResetObject(D_hd[i]); END; PROCEDURE Change_ST(i:INTEGER; Cb:BOOLEAN); BEGIN IF ItemSel(iPD_Rb) THEN SetObjectVariableBoolean(D_hd[i],vShowPrimDimText,Cb); IF ItemSel(iSD_Rb) THEN SetObjectVariableBoolean(D_hd[i],vShowSecondDimText,Cb); ResetObject(D_hd[i]); END; PROCEDURE Change_DP(i,CN:INTEGER); BEGIN IF ItemSel(iPD_Rb) THEN SetObjectVariableLongint(D_hd[i],vPrimDimPrecision,CN); IF ItemSel(iSD_Rb) THEN SetObjectVariableLongint(D_hd[i],vSecondDimPrecision,CN); ResetObject(D_hd[i]); END; PROCEDURE Change_SO(i,CN:INTEGER); BEGIN CASE CN OF 0:BEGIN SetObjectVariableBoolean(D_hd[i],vShowOnlyPrim,TRUE); SetObjectVariableBoolean(D_hd[i],vShowOnlySecond,FALSE); END; 1:BEGIN SetObjectVariableBoolean(D_hd[i],vShowOnlyPrim,FALSE); SetObjectVariableBoolean(D_hd[i],vShowOnlySecond,TRUE); END; 2:BEGIN SetObjectVariableBoolean(D_hd[i],vShowOnlyPrim,FALSE); SetObjectVariableBoolean(D_hd[i],vShowOnlySecond,FALSE); END; END; ResetObject(D_hd[i]); END; PROCEDURE Get_DimInfo(i:INTEGER); BEGIN SelChoice(iSO_Pdm,2,TRUE); IF GetObjectVariableBoolean(D_hd[i],vShowOnlyPrim) THEN SelChoice(iSO_Pdm,0,TRUE); IF GetObjectVariableBoolean(D_hd[i],vShowOnlySecond) THEN SelChoice(iSO_Pdm,1,TRUE); IF ItemSel(iPD_Rb) THEN BEGIN SelChoice(iDP_Pdm,GetObjectVariableLongint(D_hd[i],vPrimDimPrecision),TRUE); SetItem(iST_Cb,GetObjectVariableBoolean(D_hd[i],vShowPrimDimText)); SetField(iLT_Et,GetObjectVariableString(D_hd[i],vPrimLeadText)); SetField(iTT_Et,GetObjectVariableString(D_hd[i],vPrimTrailText)); SetItem(iK_Cb,Get_Prim_Kuraidori(D_hd[ii])); SetItemEnable(iDP_Pdm,NOT Get_Prim_Kuraidori(D_hd[ii])); END; IF ItemSel(iSD_Rb) THEN BEGIN SelChoice(iDP_Pdm,GetObjectVariableLongint(D_hd[i],vSecondDimPrecision),TRUE); SetItem(iST_Cb,GetObjectVariableBoolean(D_hd[i],vShowSecondDimText)); SetField(iLT_Et,GetObjectVariableString(D_hd[i],vSecondLeadText)); SetField(iTT_Et,GetObjectVariableString(D_hd[i],vSecondTrailText)); SetItem(iK_Cb,Get_Second_Kuraidori(D_hd[ii])); SetItemEnable(iDP_Pdm,NOT Get_Second_Kuraidori(D_hd[ii])); END; END; PROCEDURE Draw_Box(i:INTEGER); VAR p1,p2 :POINT; BEGIN IF BOX_hd<>NIL THEN BEGIN DelObject(BOX_hd); BOX_hd:=NIL; END; GetBBox(D_hd[i],p1.x,p1.y,p2.x,p2.y); Rect(p1.x,p1.y,p2.x,p2.y); BOX_hd:=LNewObj; SetPenFore(BOX_hd,65535,0,0); SetFPat(BOX_hd,0); SetDSelect(BOX_hd); END; PROCEDURE Set_Et; BEGIN IF ItemSel(iM_Rb) THEN BEGIN SetTextEditable(iLT_Et,FALSE); SetTextEditable(iTT_Et,FALSE); END; IF ItemSel(iS_Rb) THEN BEGIN SetTextEditable(iLT_Et,TRUE); SetTextEditable(iTT_Et,TRUE); END; END; BEGIN CASE item OF SetupDialogC: BEGIN SetItem(iS_Rb,TRUE); IF D_num=1 THEN SetItemEnable(iM_Rb,FALSE); Set_Et; ii:=1; IF ii=1 THEN SetItemEnable(iP_Pb,FALSE); IF ii=D_num THEN SetItemEnable(iN_Pb,FALSE); Draw_Box(ii); ReDrawAll; InsertChoice(iSO_Pdm,0,'主単位のみ'); InsertChoice(iSO_Pdm,1,'補助単位のみ'); InsertChoice(iSO_Pdm,2,'主単位+補助単位'); InsertChoice(iDP_Pdm,0,'1'); InsertChoice(iDP_Pdm,1,'.1'); InsertChoice(iDP_Pdm,2,'.01'); InsertChoice(iDP_Pdm,3,'.001'); InsertChoice(iDP_Pdm,4,'.0001'); InsertChoice(iDP_Pdm,5,'.00001'); InsertChoice(iDP_Pdm,6,'.000001'); InsertChoice(iDP_Pdm,7,'.0000001'); InsertChoice(iDP_Pdm,8,'.00000001'); InsertChoice(iDP_Pdm,9,'.000000001'); InsertChoice(iDP_Pdm,10,'.0000000001'); Get_DimInfo(ii); END; iM_Rb,iS_Rb: Set_Et; iP_Pb: BEGIN ii:=ii-1; IF ii=1 THEN SetItemEnable(iP_Pb,FALSE) ELSE SetItemEnable(iP_Pb,TRUE); IF ii=D_num THEN SetItemEnable(iN_Pb,FALSE) ELSE SetItemEnable(iN_Pb,TRUE); Draw_Box(ii); ReDrawAll; Get_DimInfo(ii); END; iN_Pb: BEGIN ii:=ii+1; IF ii=1 THEN SetItemEnable(iP_Pb,FALSE) ELSE SetItemEnable(iP_Pb,TRUE); IF ii=D_num THEN SetItemEnable(iN_Pb,FALSE) ELSE SetItemEnable(iN_Pb,TRUE); Draw_Box(ii); ReDrawAll; Get_DimInfo(ii); END; iSO_Pdm: BEGIN GetSelChoice(iSO_Pdm,0,CN,CS); IF ItemSel(iM_Rb) THEN FOR i:=1 TO D_num DO Change_SO(i,CN); IF ItemSel(iS_Rb) THEN Change_SO(ii,CN); Draw_Box(ii); ReDrawAll; END; iPD_Rb,iSD_Rb: Get_DimInfo(ii); iDP_Pdm: BEGIN GetSelChoice(iDP_Pdm,0,CN,CS); IF ItemSel(iM_Rb) THEN FOR i:=1 TO D_num DO Change_DP(i,CN); IF ItemSel(iS_Rb) THEN Change_DP(ii,CN); Draw_Box(ii); ReDrawAll; END; iST_Cb: BEGIN IF ItemSel(iM_Rb) THEN FOR i:=1 TO D_num DO Change_ST(i,ItemSel(iST_Cb)); IF ItemSel(iS_Rb) THEN Change_ST(ii,ItemSel(iST_Cb)); Draw_Box(ii); ReDrawAll; END; iLT_Et,iTT_Et: BEGIN Change_Et(ii,GetField(iLT_Et),GetField(iTT_Et)); Draw_Box(ii); ReDrawAll; END; iK_Cb: BEGIN IF ItemSel(iM_Rb) THEN BEGIN IF ItemSel(iPD_Rb) THEN FOR i:=1 TO D_num DO Set_Prim_Kuraidori(D_hd[i],ItemSel(iK_Cb)); IF ItemSel(iSD_Rb) THEN FOR i:=1 TO D_num DO Set_Second_Kuraidori(D_hd[i],ItemSel(iK_Cb)); END; IF ItemSel(iS_Rb) THEN BEGIN IF ItemSel(iPD_Rb) THEN Set_Prim_Kuraidori(D_hd[ii],ItemSel(iK_Cb)); IF ItemSel(iSD_Rb) THEN Set_Second_Kuraidori(D_hd[ii],ItemSel(iK_Cb)); END; Draw_Box(ii); ReDrawAll; Get_DimInfo(ii); END; 2256: BEGIN DelObject(BOX_hd); BOX_hd:=NIL; END; END; END; BEGIN D_ID := CreateLayout('寸法線',TRUE,'','終了'); CreateGroupBox (D_ID,iMS_Gb,Concat('寸法線を ',D_num,' 選択中'),TRUE); CreateRadioButton (D_ID,iM_Rb,'複数'); CreateRadioButton (D_ID,iS_Rb,'単独'); CreatePushButton (D_ID,iP_Pb,'Prev'); CreatePushButton (D_ID,iN_Pb,'Next'); CreateStaticText (D_ID,iSO_St,'寸法の見せ方:',St_width); CreatePullDownMenu (D_ID,iSO_Pdm,Pdm_width); CreateSeparator (D_ID,iSO_s,iLength); CreateGroupBox (D_ID,iPS_Gb,'',FALSE); CreateRadioButton (D_ID,iPD_Rb,'基準単位'); CreateRadioButton (D_ID,iSD_Rb,'補助単位'); CreateStaticText (D_ID,iDP_St,'精度:',St_width); CreatePullDownMenu (D_ID,iDP_Pdm,Pdm_width); CreateCheckBox (D_ID,iST_Cb,'寸法値の表示'); CreateStaticText (D_ID,iLT_St,'前記号:',St_width); CreateEditText (D_ID,iLT_Et,'',Pdm_width); CreateStaticText (D_ID,iTT_St,'後記号:',St_width); CreateEditText (D_ID,iTT_Et,'',Pdm_width); CreateSeparator (D_ID,iK_s,iLength); CreateCheckBox (D_ID,iK_Cb,'数値位取り'); SetHelpString (iLT_Et,'複数選択では編集不可'); SetHelpString (iTT_Et,'複数選択では編集不可'); SetFirstLayoutItem (D_ID,iMS_Gb); AlignItemEdge (D_ID,iMS_Gb,AE_Right,D_ID,AM_Resize); SetFirstGroupItem (D_ID,iMS_Gb,iM_Rb); SetRightItem (D_ID,iM_Rb,iS_Rb,0,0); SetBelowItem (D_ID,iM_Rb,iP_Pb,0,0); SetRightItem (D_ID,iP_Pb,iN_Pb,0,0); SetBelowItem (D_ID,iMS_Gb,iSO_St,0,0); SetRightItem (D_ID,iSO_St,iSO_Pdm,0,0); AlignItemEdge (D_ID,iSO_Pdm,AE_Right,D_ID,AM_Shift); SetBelowItem (D_ID,iSO_St,iSO_s,0,0); AlignItemEdge (D_ID,iSO_s,AE_Right,D_ID,AM_Resize); SetBelowItem (D_ID,iSO_s,iPS_Gb,0,0); SetFirstGroupItem (D_ID,iPS_Gb,iPD_Rb); SetRightItem (D_ID,iPD_Rb,iSD_Rb,0,0); SetBelowItem (D_ID,iPS_Gb,iDP_St,0,0); SetRightItem (D_ID,iDP_St,iDP_Pdm,0,0); AlignItemEdge (D_ID,iDP_Pdm,AE_Right,D_ID,AM_Shift); SetBelowItem (D_ID,iDP_St,iST_Cb,0,0); SetBelowItem (D_ID,iST_Cb,iLT_St,0,0); SetRightItem (D_ID,iLT_St,iLT_Et,0,0); AlignItemEdge (D_ID,iLT_Et,AE_Right,D_ID,AM_Shift); SetBelowItem (D_ID,iLT_St,iTT_St,0,0); SetRightItem (D_ID,iTT_St,iTT_Et,0,0); AlignItemEdge (D_ID,iTT_Et,AE_Right,D_ID,AM_Shift); SetBelowItem (D_ID,iTT_St,iK_s,0,0); AlignItemEdge (D_ID,iK_s,AE_Right,D_ID,AM_Resize); SetBelowItem (D_ID,iK_s,iK_Cb,0,0); IF VerifyLayout(D_ID) THEN D_Res:=RunLayoutDialog(D_ID,HandleEvents); END; FUNCTION Get_Dimension(TO_hd:HANDLE):BOOLEAN; LABEL 99; CONST tDIMENSION=63; {寸法線} vDimensionType=26; {寸法の種類} dtAngular=5; {角度寸法線} BEGIN IF ( GetType(TO_hd)=tDIMENSION ) & ( GetObjectVariableInt(TO_hd,vDimensionType)<>dtAngular ) THEN BEGIN i:=i+1; D_hd[i]:=TO_hd; END; IF i>D_num THEN BEGIN AlrtDialog('オブジェト数が異常です'); Get_Dimension:=TRUE; END ELSE Get_Dimension:=FALSE; END; BEGIN IF FSActLayer=NIL THEN BEGIN AlrtDialog('選択されているオブジェクトがありません'); {プロパティで対応可} GOTO 999; END; AL_name:=GetLName(ActLayer); D_num:=Count(( INVIEWPORT & (SEL=TRUE) & (L=AL_name) & (T=DIMENSION) )); IF D_num>0 THEN BEGIN ALLOCATE D_hd[1..D_num]; i:=0; ForEachObjectInLayer(Get_Dimension,objOptions,travOptions,layerOptions); D_num:=i; END; IF D_num=0 THEN BEGIN AlrtDialog('対象となるオブジェクトが選択されていません'); GOTO 999; END; Dialog_Dimension; 999:END; Run(Change_Dimension);