PROCEDURE Get3D_Size; LABEL 99,999; CONST vLayerType=154; {レイヤの種類} ltDesign=1; ltSheet=2; pPrimShowUnitMark=163; {単位記号の表示(主単位)} tGROUP=11; {グループ} tSYMBOL=15; {シンボル} tCSGSolid=84; {ソリッドモデラー} s3DSelect=-349; {ツール 3Dセレクションポインタ} vObjectIs3D=650; {ステータス 3Dオブジェクト} VAR Show_UM :BOOLEAN; WS_hd,Root_hd,TO_hd :HANDLE; i :INTEGER; PROCEDURE Load3D_Size(WS_hd,TO_hd:HANDLE; i:INTEGER); VAR name :STRING; width,height,depth :REAL; c_CR,c_CC,t_RR,l_RC,t_RS,b_RR,r_RC,b_RS, fontIndex,size,style :INTEGER; BEGIN IF GetType(TO_hd)=tSYMBOL THEN name:=GetSymName(TO_hd) ELSE BEGIN name:=GetName(TO_hd); IF ( name='' ) | ( name='none' ) THEN name:=Concat('Type=',GetType(TO_hd)); END; Get3DInfo(TO_hd,height,width,depth); AlertInform('サイズを取得しました。',concat('名前=',name,' 幅=',width,',高さ=',height,',奥行き=',depth),TRUE); GetWSSelection(WS_hd,c_CR,c_CC,t_RR,l_RC,t_RS,b_RR,r_RC,b_RS); { message(c_CR,' ',c_CC,' ',t_RR,' ',l_RC,' ',t_RS,' ',b_RR,' ',r_RC,' ',b_RS);} { GetWSCellTextFormat(WS_hd,c_CR+i,c_CC,fontIndex,size,style); LoadCell(c_CR+i,c_CC,name); LoadCell(c_CR+i,c_CC+1,Num2StrF(width)); LoadCell(c_CR+i,c_CC+2,Num2StrF(height)); LoadCell(c_CR+i,c_CC+3,Num2StrF(depth)); SetWSCellTextFormat(WS_hd,c_CR+i,c_CC,c_CR+i,c_CC+3,fontIndex,size,style); RecalculateWS(WS_hd); ResetObject(WS_hd); } SetWSCellFormula(WS_hd,c_CR+i,c_CC,c_CR+i,c_CC,name); SetWSCellFormula(WS_hd,c_CR+i,c_CC+1,c_CR+i,c_CC+1,Num2StrF(width)); SetWSCellFormula(WS_hd,c_CR+i,c_CC+2,c_CR+i,c_CC+2,Num2StrF(height)); SetWSCellFormula(WS_hd,c_CR+i,c_CC+3,c_CR+i,c_CC+3,Num2StrF(depth)); END; FUNCTION Get3D_SelectHandle(P_hd:HANDLE):HANDLE; VAR O_hd :HANDLE; BEGIN CASE GetType(P_hd) OF tGROUP: O_hd:=FInGroup(P_hd); tSYMBOL: BEGIN SetActSymbol(GetSymName(P_hd)); O_hd:=FInSymDef(ActSymDef); END; tCSGSolid: O_hd:=FIn3D(P_hd); END; IF Selected(O_HD) THEN Get3D_SelectHandle:=O_hd ELSE Get3D_SelectHandle:=NextSObj(O_hd); END; FUNCTION Get3D_RootHandle(P_hd:HANDLE):HANDLE; LABEL 99,999; VAR O_hd :HANDLE; BEGIN Get3D_RootHandle:=P_hd; 99:CASE GetType(P_hd) OF tGROUP: O_hd:=FInGroup(P_hd); tSYMBOL: BEGIN SetActSymbol(GetSymName(P_hd)); O_hd:=FInSymDef(ActSymDef); END; tCSGSolid: O_hd:=FIn3D(P_hd); OTHERWISE BEGIN Get3D_RootHandle:=NIL; GOTO 999; END; END; WHILE O_hd<>NIL DO BEGIN IF Selected(O_hd) THEN BEGIN Get3D_RootHandle:=O_hd; P_hd:=O_hd; GOTO 99; END; O_hd:=NextSObj(O_hd); END; 999:END; BEGIN IF GetObjectVariableInt(ActLayer,vLayerType)=ltSheet THEN BEGIN AlrtDialog('このツールはシートレイヤでは使用できません'); GOTO 999; END; IF GetTopVisibleWS=NIL THEN {ActSSheet} AlrtDialog('ワークシートがアクティブではありません') ELSE BEGIN WS_hd:=GetTopVisibleWS; {ActSSheet} DSelectAll; IF FSActLayer<>NIL THEN BEGIN Root_hd:=Get3D_RootHandle(FSActLayer); IF Root_hd=NIL THEN BEGIN AlrtDialog('3Dオブジェクトを選択できない状態にあります'); GOTO 999; END; END; Show_UM:=GetPref(pPrimShowUnitMark); IF Show_UM THEN SetPref(pPrimShowUnitMark,FALSE); i:=0; AlrtDialog('3Dオブジェクトを選択して下さい'); 99: DSelectAll; ReDrawAll; CallTool(s3DSelect); IF Root_hd=NIL THEN TO_hd:=FSActLayer ELSE TO_hd:=Get3D_SelectHandle(Root_hd); { AlrtDialogConcat((GetType(Root_hd),',',GetType(TO_hd)));} IF TO_hd<>NIL THEN BEGIN IF NextSObj(TO_hd)<>NIL THEN IF YNDialog('複数選択されています、選択し直して下さい') THEN GOTO 99 ELSE GOTO 999; {!「GetObjectVariableBoolean」は図形が選択されていないと、無限ループする。 ハイブリッドオブジェクトは、表示(2D、3D)で判定が違う。} IF GetObjectVariableBoolean(TO_hd,vObjectIs3D) THEN BEGIN Load3D_Size(WS_hd,TO_hd,i); IF YNDialog('続けて選択しますか?') THEN BEGIN i:=i+1; GOTO 99; END; END ELSE IF YNDialog('3Dオブジェクトではありません、選択し直して下さい') THEN GOTO 99; END ELSE IF YNDialog('図形が選択されていません、選択し直して下さい') THEN GOTO 99; END; 999:SetPref(pPrimShowUnitMark,Show_UM); END; Run(Get3D_Size);