調整Refdes, Value, Pin Number的文字於中心點工具

 

工具畫面如下

以下是源代碼說明

源代碼共設計有下列函數

fnTextTuneTools()             主程式
fnTTFormBuild()                建立視窗的函數
fnTTSetVariables()            設定變數
fnTTSetFormField()            設定視窗裡面的預設值
fnTTStart()                         開始
fnTTPopup()                      浮動視窗
fnTTCheckPopup()
fnTTPopupDone()
fnTTPopupOops()
fnTTPopupCancel()
fnTTModifyText()                  改變文字
fnTTCalculateTextRotation() 計算文字的角度
fnTTGetLayerColor()             取得層面的顏色
fnTTGetPinData()                 取得PIN的資訊
fnTTGetSymData()               取得SYMBOL的資訊
fnTTGetTextData()               取得TEXT的資訊
fnTTCalculateTextBlock()    計算文字是屬於哪一個Block
fnTTOffsetCorrection()
fnTTGetMaxExtents()
fnTTGetBoxCenter()
fnTTGetBlockInfo()
fnTTLayerPopupSetup()
gfnPopupUndoTimes()
gfnSetAlias()
fnTTUpdateFormField()
fnTTUpdateTextBlkValue()
fnTTExit()
fnTTCalback()

1. 主程式 fnTextTuneTools()

procedure(fnTextTuneTools()
	prog((tVersion tCompanyName frmTT)
		tVersion = strcat("V" "1" "." "8" "0")
		
		frmTT = fnTTFormBuild() 
		fnTTSetVariables(frmTT)
		fnTTSetFormField(frmTT)
		fnTTStart()
	)
)

2. 建立視窗函數 fnTTFormBuild()

procedure(fnTTFormBuild() 
	let((tTTFormFile xMaxTextBlock pTTForm frmTT xX xY tS0 tS1 tS2 tS3 tS4 tS5 tS6 tS7 tS8 tS9 
		tS10 tS11 tS12 tS13 tS14 tS15 tS16 tS17 tS18 tS19 tS20 tS21 tS22 tS23 tS24 tS25 tS26 tS27 tS28 tS29
		tS30 tS31 tS32 tS33 tS34 tS35 tS36 tS37 tS38 tS39 tS40 tS41 tS42 tS43 tS44 tS45 tS46 tS47 tS48 tS49 
		tS50 tS51 tS52 tS53 tS54 tS55 tS56 tS57 tS58 tS59) 
		drain()
		;setShellEnvVar("LANG=ENG")
		case(getShellEnvVar("LANG")
			("BIG5"
				tS0 = "\276\314\303\322\246W\272\331"	;憑證名稱
				tS1 = "\245D\265{\246\241"				;主程式
				tS2 = "\244\345\246r\274h\263]\251w"	;文字層設定
				tS3 = "\244\345\246r\246W\272\331"		;文字名稱
				tS4 = "\274h\255\261\246W\272\331" 		;層面名稱
				tS5 = "\245~\256\330\270\352\256\306"	;外框資料
				tS6 = "\305\343\245\334\263\273\274h"		;顯示頂層
				tS7 = "\305\343\245\334\251\263\274h"	;顯示底層
				tS8 = "\251\263\274h\271s\245\363\263]\251w"	;底層零件設定
				tS9 = "\244\345\246r\303\350\271\263"		;文字鏡像
				tS10 = "\260\365\246\346\274\322\246\241\263]\251w"		;執行模式設定
				tS11 = "\261\333\302\340\244\345\246r"	;旋轉文字
				tS12 = "\244\345\246r\262\276\260\312\250\354\244\244\244\337"				;文字移動到中心
				tS13 = "X\266b\266Z\302\367"			;X軸距離
				tS14 = "Y\266b\266Z\302\367"			;Y軸距離
				tS15 = "\246X\276A\244\345\246r"		;合適文字
				tS16 = "\247\357\305\334\244\345\246r\275s\270\271"	;改變文字編號
				tS17 = "\305\343\245\334\244\345\246r\275s\270\271" ;顯示文字編號
				tS20 = "\274\322\246\241\266i\266\245\263]\251w"		;模式進階設定
				tS21 = "\261\333\302\340\244\345\246r\277\357\266\265"	;旋轉文字選項
				tS22 = "\244\345\246r\252\272\244\350\246V\250\244\253\327"	;文字的方向角度
				tS23 = "\263\273\274h\244\364\245\255\244\350\246V"	;頂層水平方向
				tS24 = "\253\327"						;度
				tS25 = "\263\273\274h\253\253\252\275\244\350\246V"	;頂層垂直方向
				tS26 = "\251\263\274h\244\364\245\255\244\350\246V"	;底層水平方向
				tS27 = "\251\263\274h\253\253\252\275\244\350\246V"	;底層垂直方向
				tS28 = "\261j\255\242\247\357\305\334\250\244\253\327"	;強迫改變角度
				tS29 = "\251M\271s\245\363\244@\274\313\252\272\250\244\253\327"	;和零件一樣的角度 ;計算基礎的文字角度
				tS30 = "\244\345\246r\244\244\244\337\277\357\266\265"	;文字中心選項
				tS31 = "\256\325\245\277\260\276\262\276\255\310"	;校正偏移值
				tS32 = "\246X\276A/\247\357\305\334\244\345\246r\277\357\266\265"	;合適/改變文字選項
				tS33 = "\253\374\251w\260\252\253\327"	;指定高度
				tS34 = "\263\314\244p\255\310"	;最小值
				tS35 = "\263\314\244j\255\310"	;最大值
				tS36 = "\253\374\251w\244\345\246r\275s\270\271"	;指定文字編號
				tS37 = "\245~\256\330\273P\244\345\246r\303\344\275t\266\241\266Z"	;外框與文字邊緣間距
				tS40 = "\260\365\246\346"		;執行
				tS41 = "\265\262\247\364"		;結束
				tS50 = "\303B\245~\277\357\266\265"			;額外選項
				tS51 = "\265\262\247\364\253\341,\305\343\245\334\260\365\246\346\246\271\244u\250\343\253e\252\272\265e\255\261"			;結束後,顯示執行此工具前的畫面
				tS52 = "\255\327\247\357\244\345\246r\275s\270\271\277\357\266\265"	;修改文字編號選項
				tS53 = "\244\345\246r\275s\270\271"				;文字編號
				tS54 = "\244\345\246r\274e\253\327"					;文字寬度
				tS55 = "\244\345\246r\260\252\253\327"					;文字高度
				tS56 = "\246\346\273P\246\346\252\272\266\241\266Z" ;行與行的間距
				tS57 = "\251\263\244\371\275u\274e" ;底片線寬
				tS58 = "\246r\273P\246r\252\272\266\241\266Z" ;字與字的間距
			)
			("GB"
				tS0 = "\306\276\326\244\303\373\263\306"	;??名?
				tS1 = "\326\367\263\314\320\362"				;主程序
				tS2 = "\316\304\327\326\262\343\311\350\266\250"	;文字??定
				tS3 = "\316\304\327\326\303\373\263\306"		;文字名?
				tS4 = "\262\343\303\346\303\373\263\306" 		;?面名?
				tS5 = "\315\342\277\362\327\312\301\317"	;外框?料
				tS6 = "\317\324\312\276\266\245\262\343"		;?示??
				tS7 = "\317\324\312\276\265\327\262\343"	;?示底?
				tS8 = "\265\327\262\343\301\343\274\376\311\350\266\250"	;底?零件?定
				tS9 = "\316\304\327\326\276\265\317\361"		;文字?像
				tS10 = "\326\264\320\320\304\243\312\275\311\350\266\250"		;?行模式?定
				tS11 = "\320\375\327\252\316\304\327\326" 	;旋?文字
				tS12 = "\316\304\327\326\322\306\266\257\265\275\326\320\320\304"				;文字移?到中心
				tS13 = "X\326\341\276\340\300\353"			;X?距离
				tS14 = "Y\326\341\276\340\300\353"			;Y?距离
				tS15 = "\272\317\312\312\316\304\327\326"		;合适文字
				tS16 = "\320\336\270\304\327\326\272\305\264\363\320\241"	;修改字?大小
				tS17 = "\317\324\312\276\327\326\272\305\264\363\320\241" 	;?示字?大小
				tS20 = "\304\243\312\275\275\370\275\327\311\350\266\250"		;模式???定
				tS21 = "\320\375\327\252\316\304\327\326\321\241\317\356"	;旋?文字??
				tS22 = "\316\304\327\326\265\304\267\275\317\362\275\307\266\310"	;文字的方向角度
				tS23 = "\266\245\262\343\313\256\306\275\267\275\317\362"	;??水平方向
				tS24 = "\266\310"						;度
				tS25 = "\266\245\262\343\264\271\326\261\267\275\317\362"	; ??垂直方向
				tS26 = "\265\327\262\343\313\256\306\275\267\275\317\362"	;底?水平方向
				tS27 = "\265\327\262\343\264\271\326\261\267\275\317\362"	;底?垂直方向
				tS28 = "\307\277\306\310\270\304\261\344\275\307\266\310"	;?迫改?角度
				tS29 = "\272\315\301\343\274\376\322\273\321\371\265\304\275\307\266\310"	;和零件一?的角度 ;?算基?的文字角度
				tS30 = "\316\304\327\326\326\320\320\304\321\241\317\356"	;文字中心??
				tS31 = "\320\243\325\375\306\253\322\306\326\265"	;校正偏移值
				tS32 = "\272\317\312\312/\320\336\270\304\316\304\327\326\321\241\317\356"	;合适/修改文字??
				tS33 = "\326\270\266\250\270\337\266\310"	;指定高度
				tS34 = "\327\356\320\241\326\265"	;最小值
				tS35 = "\327\356\264\363\326\265"	;最大值
				tS36 = "\326\270\266\250\327\326\272\305\264\363\320\241"	;指定字?大小
				tS37 = "\315\342\277\362\323\353\316\304\327\326\261\337\324\265\274\344\276\340"	;外框与文字???距
				tS40 = "\326\264\320\320"		;?行
				tS41 = "\275\341\312\370"		;?束
				tS50 = "\266\356\315\342\321\241\317\356"			;?外??
				tS51 = "\275\341\312\370\272\363,\317\324\312\276\326\264\320\320\264\313\271\244\276\337\307\260\265\304\273\255\303\346"			; ?束后,?示?行此工具前的?面
				tS52 = "\320\336\270\304\327\326\314\345\261\340\272\305\321\241\317\356"	;修改字体????
				tS53 = "\327\326\314\345\261\340\272\305"				;字体??
				tS54 = "\327\326\314\345\277\355\266\310"					; 字体?度
				tS55 = "\327\326\314\345\270\337\266\310"					; 字体高度
				tS56 = "\320\320\323\353\320\320\265\304\274\344\276\340" ;行与行的?距
				tS57 = "\265\327\306\254\317\337\277\355" ;底片??
				tS58 = "\327\326\323\353\327\326\265\304\274\344\276\340" ;字与字的?距
			)
			(t
				tS0 = "Licensed for"
				tS1 = "Main"
				tS2 = "Objects"
				tS3 = "Label name"
				tS4 = "Label layer"
				tS5 = "Outline data"
				tS6 = "Top Side"
				tS7 = "Bottom Side"
				tS8 = "Components on bottom side"
				tS9 = "Label mirrored"
				tS10 = "Mode"
				tS11 = "Rotate Text"
				tS12 = "Center Text"
				tS13 = "Dx"
				tS14 = "Dy"
				tS15 = "Fit Text"
				tS16 = "Modify TextBlk"
				tS17 = "Display TextBlk"
				tS20 = "Advanced"
				tS21 = "Text rotation"
				tS22 = "Calculate longest side"
				tS23 = "TOP horizontal:"
				tS24 = "deg"
				tS25 = "TOP vertical:"
				tS26 = "BOTTOM horizontal:"
				tS27 = "BOTTOM vertical:"
				tS28 = "Force angle"
				tS29 = "Calculate based on label angle (symdef)"
				tS30 = "Text center"
				tS31 = "Offset correction:"
				tS32 = "Text fit / modify"
				tS33 = "Specify by height"
				tS34 = "Min"
				tS35 = "Max"
				tS36 = "Specify by block"
				tS37 = "Clearance to boundary:"
				tS40 = "Execute"
				tS41 = "Exit"
				tS50 = "Option"
				tS51 = "Restore View"
				tS52 = "Change TextBlk Value"
				tS53 = "Text Block"
				tS54 = "Width"
				tS55 = "Height"
				tS56 = "Line Space"
				tS57 = "Photo Width"
				tS58 = "Char Space"
			)
		)
		xAccuracy = cadr(axlDBGetDesignUnits())
		xMaxTextBlock = axlDBControl('maxTextBlock)
		tTTFormFile = axlTempFile()
		pTTForm = outfile(tTTFormFile)
		fprintf(pTTForm "FILE_TYPE=FORM_DEFN VERSION=2\n") 
		fprintf(pTTForm "FORM TOOLWINDOW\n") 
		fprintf(pTTForm "FIXED\n")
		fprintf(pTTForm "PORT 36 45\n") 
		fprintf(pTTForm "HEADER \"Text Tune Tools\"\n")
		
		fprintf(pTTForm "POPUP <outline_layer_popup> \"1\" \"1\",\"2\" \"2\".\n") 
		fprintf(pTTForm "POPUP <label_name_popup> \"Refdes\" \"refdes\",\"Value\" \"value\",\"Part Number\" \"part_number\",\"Device Type\" \"device_type\",\"Tolerance\" \"tolerance\",\"Package Geo\" \"package_geo1\".\n") 
		fprintf(pTTForm "POPUP <label_layer_popup> \"1\" \"1\",\"2\" \"2\".\n")
		fprintf(pTTForm "POPUP <force_angle_popup> \"0\" \"0\",\"90\" \"90\",\"180\" \"180\",\"270\" \"270\".\n") 
		fprintf(pTTForm "POPUP <horizontal_popup> \"0\" \"0\",\"180\" \"180\".\n") 
		fprintf(pTTForm "POPUP <vertical_popup> \"90\" \"90\",\"270\" \"270\".\n") 
		fprintf(pTTForm "\n") 
		fprintf(pTTForm "TILE\n")
		xX = 1
		xY = 0
		fprintf(pTTForm "GROUP \"%s\"\n" tS0)
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "FSIZE 34 4\n") 
		fprintf(pTTForm "ENDGROUP\n\n")
		xX = xX + 1
		xY = xY + 2
		fprintf(pTTForm "TEXT\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "INFO F_lblCopyright 21\n")
		fprintf(pTTForm "OPTIONS BOLD\n")
		fprintf(pTTForm "ENDTEXT\n")
		;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
		xX = 1
		xY = xY + 3
		fprintf(pTTForm "TABSET \"tab\"\n")
		fprintf(pTTForm "OPTIONS tabsetDispatch\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "FSIZE 35 40\n")
		;===============================================================
		xX = 1
		xY = 0
		fprintf(pTTForm "TAB \"%s\"\n" tS1) 
		fprintf(pTTForm "GROUP \"%s\"\n" tS2) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "FSIZE 32 13\n")
		fprintf(pTTForm "ENDGROUP\n")
		xX = xX + 1
		xY = xY + 2
		fprintf(pTTForm "TEXT \"%s\"\n" tS3) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 12
		fprintf(pTTForm "FIELD F_popLabelName\n")
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENUMSET 15\n") 
		fprintf(pTTForm "POP \"label_name_popup\"\n") 
		fprintf(pTTForm "ENDFIELD\n")
		xX = 2
		xY = xY + 3
		fprintf(pTTForm "TEXT \"%s\"\n" tS4)
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 12
		fprintf(pTTForm "FIELD F_popLabelLayer\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENUMSET 15\n")
		fprintf(pTTForm "POP \"label_layer_popup\"\n") 
		fprintf(pTTForm "ENDFIELD\n")
		xX = 2
		xY = xY + 3
		fprintf(pTTForm "TEXT \"%s\"\n" tS5) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 12
		fprintf(pTTForm "FIELD F_popOutlineLayer\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENUMSET 15\n") 
		fprintf(pTTForm "POP \"outline_layer_popup\"\n") 
		fprintf(pTTForm "ENDFIELD\n")
		xX = 2
		xY = xY + 3
		;設定為動態的Color
		fprintf(pTTForm "FIELD F_clrTop\n")
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "COLOR 3 1\n")
		;fprintf(pTTForm "OPTIONS colorchooser")
		fprintf(pTTForm "ENDFIELD\n")
		xX = xX + 4
		fprintf(pTTForm "TEXT \"%s\"\n" tS6)
		fprintf(pTTForm "TLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n\n")
		xX = xX + 10
		fprintf(pTTForm "FIELD F_clrBottom\n")
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "COLOR 3 1\n")
		;fprintf(pTTForm "OPTIONS colorchooser")
		fprintf(pTTForm "ENDFIELD\n")
		xX = xX + 4
		fprintf(pTTForm "TEXT \"%s\"\n" tS7)
		fprintf(pTTForm "TLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n\n")
		
		xX = 1
		xY = xY + 2
		fprintf(pTTForm "GROUP \"%s\"\n" tS8) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "FSIZE 32 6\n") 
		fprintf(pTTForm "ENDGROUP\n")
		xX = xX + 1
		xY = xY + 3
		;fprintf(pTTForm "FIELD F_rdoMirrorBottomOnly\n")
		fprintf(pTTForm "FIELD F_chkMirrorBottomOnly\n")
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "CHECKLIST \"%s\"\n" tS9) 
		fprintf(pTTForm "ENDFIELD\n")
		;xY = xY + 3
		;fprintf(pTTForm "FIELD F_rdoNoMirror\n") 
		;fprintf(pTTForm "FLOC %d %d\n" xX xY)
		;fprintf(pTTForm "CHECKLIST \"Label not mirrored\" \"tm\" \n") 
		;fprintf(pTTForm "ENDFIELD\n")
		xX = 1
		xY = xY + 3
		fprintf(pTTForm "GROUP \"%s\"\n" tS10) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "FSIZE 32 17\n")
		fprintf(pTTForm "ENDGROUP\n")
		xX = xX + 1
		xY = xY + 3
		fprintf(pTTForm "FIELD	F_ckbRotateText\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "CHECKLIST \"%s\"\n" tS11) 
		fprintf(pTTForm "ENDFIELD\n")
		xY = xY + 2
		fprintf(pTTForm "FIELD F_ckbCenterText\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "CHECKLIST \"%s\"\n" tS12) 
		fprintf(pTTForm "ENDFIELD\n")
		xX = xX + 2
		xY = xY + 2
		fprintf(pTTForm "TEXT \"%s\"\n" tS13)
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 7
		fprintf(pTTForm "FIELD F_iptDx\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "REALFILLIN 5 10\n")
		fprintf(pTTForm "DECIMAL %d\n" xAccuracy) 
		fprintf(pTTForm "ENDFIELD\n")
		xX = xX - 7
		xY = xY + 2
		fprintf(pTTForm "TEXT \"%s\"\n" tS14) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 7
		fprintf(pTTForm "FIELD F_iptDy\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "REALFILLIN 5 10\n") 
		fprintf(pTTForm "DECIMAL %d\n" xAccuracy) 
		fprintf(pTTForm "ENDFIELD\n")
		xX = 2
		xY = xY + 2
		fprintf(pTTForm "FIELD F_ckbFitText\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "CHECKLIST \"%s\"\n" tS15) 
		fprintf(pTTForm "ENDFIELD\n")
		xY = xY + 2
		fprintf(pTTForm "FIELD F_ckbModifyTextBlk\n")
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "CHECKLIST \"%s\"\n" tS16)
		fprintf(pTTForm "ENDFIELD\n")
		xY = xY + 2
		fprintf(pTTForm "FIELD F_ckbDisplayTextBlk\n")
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "CHECKLIST \"%s\"\n" tS17)
		fprintf(pTTForm "ENDFIELD\n")
		fprintf(pTTForm "ENDTAB\n")
		;===============================================================
		xX = 1
		xY = 0
		fprintf(pTTForm "TAB \"%s\"\n" tS20) 
		fprintf(pTTForm "GROUP \"%s\"\n" tS21) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "FSIZE 32 17\n") 
		fprintf(pTTForm "ENDGROUP\n")
		xX = xX + 1
		xY = xY + 2
		fprintf(pTTForm "FIELD  F_rdoTextRotationLongSide\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "CHECKLIST \"%s\" \"rot\"\n" tS22) 
		fprintf(pTTForm "ENDFIELD\n")
		xX = xX + 2
		xY = xY + 2
		fprintf(pTTForm "TEXT \"%s\"\n" tS23)
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 16
		fprintf(pTTForm "FIELD F_popTopLongSideX\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENUMSET 4\n")
		fprintf(pTTForm "POP \"horizontal_popup\"\n") 
		fprintf(pTTForm "ENDFIELD\n")
		xX = xX + 8
		fprintf(pTTForm "TEXT \"%s\"\n" tS24) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = 4
		xY = xY + 2
		fprintf(pTTForm "TEXT \"%s\"\n" tS25) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 16
		fprintf(pTTForm "FIELD F_popTopLongSideY\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENUMSET 4\n") 
		fprintf(pTTForm "POP \"vertical_popup\"\n") 
		fprintf(pTTForm "ENDFIELD\n")
		xX = xX + 8
		fprintf(pTTForm "TEXT \"%s\"\n" tS24) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = 4
		xY = xY + 2
		fprintf(pTTForm "TEXT \"%s\"\n" tS26) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 16
		fprintf(pTTForm "FIELD F_popBottomLongSideX\n")
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENUMSET 4\n") 
		fprintf(pTTForm "POP \"horizontal_popup\"\n") 
		fprintf(pTTForm "ENDFIELD\n")
		xX = xX + 8
		fprintf(pTTForm "TEXT \"%s\"\n" tS24)
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = 4
		xY = xY + 2
		fprintf(pTTForm "TEXT \"%s\"\n" tS27) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 16
		fprintf(pTTForm "FIELD F_popBottomLongSideY\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENUMSET 4\n") 
		fprintf(pTTForm "POP \"vertical_popup\"\n") 
		fprintf(pTTForm "ENDFIELD\n")
		xX = xX + 8
		fprintf(pTTForm "TEXT \"%s\"\n" tS24) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = 2
		xY = xY + 2
		fprintf(pTTForm "FIELD F_rdoTextRotationForceAngle\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "CHECKLIST \"%s\" \"rot\"\n" tS28) 
		fprintf(pTTForm "ENDFIELD\n")
		xX = xX + 18
		fprintf(pTTForm "FIELD F_popForceAngle\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENUMSET 4\n")
		fprintf(pTTForm "POP \"force_angle_popup\"\n") 
		fprintf(pTTForm "ENDFIELD\n")
		xX = xX + 8
		fprintf(pTTForm "TEXT \"%s\"\n" tS24) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = 2
		xY = xY + 2
		fprintf(pTTForm "FIELD F_rdoTextRotationLabelAngle\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "CHECKLIST \"%s\" \"rot\"\n" tS29) 
		fprintf(pTTForm "ENDFIELD\n")
		xX = 1
		xY = xY + 3
		fprintf(pTTForm "GROUP \"%s\"\n" tS30)
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "FSIZE 32 5\n") 
		fprintf(pTTForm "ENDGROUP\n")
		xX = xX + 1
		xY = xY + 2
		fprintf(pTTForm "TEXT \"%s\"\n" tS31) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 18
		fprintf(pTTForm "FIELD F_iptOffsetCorrection\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "REALFILLIN 5 10\n") 
		fprintf(pTTForm "DECIMAL %d\n" xAccuracy)
		fprintf(pTTForm "MIN -0.5\n") 
		fprintf(pTTForm "MAX 0.5\n") 
		fprintf(pTTForm "ENDFIELD\n")
		xX = 1
		xY = xY + 3
		fprintf(pTTForm "GROUP \"%s\"\n" tS32) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "FSIZE 32 15\n") 
		fprintf(pTTForm "ENDGROUP\n")
		xX = xX + 1
		xY = xY + 2
		fprintf(pTTForm "FIELD  F_rdoTextFitByHeight\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "CHECKLIST \"%s\" \"txt_by_height\"\n" tS33)
		fprintf(pTTForm "ENDFIELD\n")
		xX = xX + 1
		xY = xY + 2
		fprintf(pTTForm "TEXT \"%s\"\n" tS34) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 6
		fprintf(pTTForm "FIELD F_iptMinTextHeight\n")
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "REALFILLIN 5 10\n") 
		fprintf(pTTForm "DECIMAL %d\n" xAccuracy) 
		fprintf(pTTForm "MIN 0.0\n") 
		fprintf(pTTForm "ENDFIELD\n")
		xX = xX + 10
		fprintf(pTTForm "TEXT \"%s\"\n" tS35) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 6
		fprintf(pTTForm "FIELD F_iptMaxTextHeight\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "REALFILLIN 5 10\n") 
		fprintf(pTTForm "DECIMAL %d\n" xAccuracy) 
		fprintf(pTTForm "MIN 0.0\n") 
		fprintf(pTTForm "ENDFIELD\n")
		xX = 2
		xY = xY + 3
		fprintf(pTTForm "FIELD  F_rdoTextFitByBlock\n")
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "CHECKLIST \"%s\" \"txt_by_height\"\n" tS36) 
		fprintf(pTTForm "ENDFIELD\n")
		xX = xX + 1
		xY = xY + 2
		fprintf(pTTForm "TEXT \"%s\"\n" tS34) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 6
		fprintf(pTTForm "FIELD F_barMinTextBlock\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "INTSLIDEBAR 2 25\n")
		fprintf(pTTForm "MIN 1\n")
		fprintf(pTTForm "MAX %d\n" xMaxTextBlock) 
		fprintf(pTTForm "ENDFIELD\n")
		xX = xX + 10
		fprintf(pTTForm "TEXT \"%s\"\n" tS35) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 6
		fprintf(pTTForm "FIELD F_barMaxTextBlock\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "INTSLIDEBAR 2 25\n") 
		fprintf(pTTForm "MIN 1\n") 
		fprintf(pTTForm "MAX %d\n" xMaxTextBlock)
		fprintf(pTTForm "ENDFIELD\n")
		xX = 2
		xY = xY + 3
		fprintf(pTTForm "TEXT \"%s\"\n" tS37) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 19
		fprintf(pTTForm "FIELD F_iptBoundaryClearance\n")
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "REALFILLIN 7 10\n") 
		fprintf(pTTForm "DECIMAL %d\n" xAccuracy) 
		fprintf(pTTForm "ENDFIELD\n")
		fprintf(pTTForm "ENDTAB\n")
		;===============================================================
		xX = 1
		xY = 0
		fprintf(pTTForm "TAB \"%s\"\n" tS50) 
		xX = xX + 1
		xY = xY + 2
		fprintf(pTTForm "FIELD F_chkRestoreView\n")
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "CHECKLIST \"%s\"\n" tS51) 
		fprintf(pTTForm "ENDFIELD\n")
		xX = 1
		xY = xY + 2
		fprintf(pTTForm "GROUP \"%s\"\n" tS52) 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "FSIZE 32 16\n") 
		fprintf(pTTForm "ENDGROUP\n")
		xX = xX + 1
		xY = xY + 3
		fprintf(pTTForm "TEXT \"%s\"\n" tS53) ;Text Block
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 14
		fprintf(pTTForm "FIELD F_barTextBlk\n") 
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "INTSLIDEBAR 3 25\n")
		fprintf(pTTForm "MIN 1\n")
		fprintf(pTTForm "MAX %d\n" xMaxTextBlock) 
		fprintf(pTTForm "ENDFIELD\n")
		xX = 2
		xY = xY + 2
		fprintf(pTTForm "TEXT \"%s\"\n" tS54) ;Width
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 14
		fprintf(pTTForm "FIELD F_iptWidth\n")
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "REALFILLIN 7 10\n") 
		fprintf(pTTForm "DECIMAL %d\n" xAccuracy) 
		fprintf(pTTForm "ENDFIELD\n")
		xX = 2
		xY = xY + 2
		fprintf(pTTForm "TEXT \"%s\"\n" tS55) ;Height
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 14
		fprintf(pTTForm "FIELD F_iptHeight\n")
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "REALFILLIN 7 10\n") 
		fprintf(pTTForm "DECIMAL %d\n" xAccuracy) 
		fprintf(pTTForm "ENDFIELD\n")
		xX = 2
		xY = xY + 2
		fprintf(pTTForm "TEXT \"%s\"\n" tS56) ;Line Space
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 14
		fprintf(pTTForm "FIELD F_iptLineSpace\n")
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "REALFILLIN 7 10\n") 
		fprintf(pTTForm "DECIMAL %d\n" xAccuracy) 
		fprintf(pTTForm "ENDFIELD\n")
		xX = 2
		xY = xY + 2
		fprintf(pTTForm "TEXT \"%s\"\n" tS57) ;Photo Width
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 14
		fprintf(pTTForm "FIELD F_iptPhotoWidth\n")
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "REALFILLIN 7 10\n") 
		fprintf(pTTForm "DECIMAL %d\n" xAccuracy) 
		fprintf(pTTForm "ENDFIELD\n")
		xX = 2
		xY = xY + 2
		fprintf(pTTForm "TEXT \"%s\"\n" tS58) ;Char Space
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "ENDTEXT\n")
		xX = xX + 14
		fprintf(pTTForm "FIELD F_iptCharSpace\n")
		fprintf(pTTForm "FLOC %d %d\n" xX xY)
		fprintf(pTTForm "REALFILLIN 7 10\n") 
		fprintf(pTTForm "DECIMAL %d\n" xAccuracy) 
		fprintf(pTTForm "ENDFIELD\n")
		fprintf(pTTForm "ENDTAB\n")
		fprintf(pTTForm "ENDTABSET\n")
		;xY = 34
		;xX = 2
		;xY = xY + 12
		;fprintf(pTTForm "FIELD F_btnExecute\n") 
		;fprintf(pTTForm "FLOC %d %d\n" xX xY)
		;fprintf(pTTForm "MENUBUTTON \"%s\" 9 4\n" tS40) 
		;fprintf(pTTForm "ENDFIELD\n")
		;xX = xX + 12
		;fprintf(pTTForm "FIELD F_btnExit\n") 
		;fprintf(pTTForm "FLOC %d %d\n" xX xY)
		;fprintf(pTTForm "MENUBUTTON \"%s\" 9 4\n" tS41) 
		;fprintf(pTTForm "ENDFIELD\n")
		
		;fprintf(pTTForm "FIELD myhelp\n")
		;fprintf(pTTForm "FLOC 28  47\n") 
		;fprintf(pTTForm "MENUBUTTON \"Help\" 9 3\n") 
		;fprintf(pTTForm "ENDFIELD\n")
		
		fprintf(pTTForm "\n") 
		fprintf(pTTForm "ENDTILE\n")
		fprintf(pTTForm "\n") 
		fprintf(pTTForm "ENDFORM\n") 
		close(pTTForm)
		frmTT = axlFormCreate(gensym() tTTFormFile '(e innter) 'fnTTCalback t) ; t) 後面不能再加入t, 否則所有輸入的數字都變成字串
		deleteFile(tTTFormFile)
		frmTT
	)
)

2. 設定變數和預設值 fnTTSetVariables()

procedure(fnTTSetVariables(frmTT)
	let((mth tTempLayer lBGColor lTempLayerColor dLayer lTexts rUserData xIndex oTextParam lOrgVis)
		mth = 'const 
		defMathConstants(mth) 
		rUserData = axlUIGetUserData() ;(doneState nil cmdPopupId nil popupId nil)
		remprop(rUserData 'transaction) 
		putprop(rUserData rUserData->popupId 'oldPopupId) ;(oldPopupId nil doneState nil cmdPopupId nil popupId nil)
		;oTextBlk = makeTable("TextBlkTable" nil)
		for(xIndex 1 axlDBControl('maxTextBlock)
			oTextParam = axlGetParam(sprintf(nil "paramTextBlock:%d" xIndex))
			when(oTextParam->height
				lTexts = cons(list(oTextParam->height xIndex) lTexts)
			)
		)
		lTexts = sortcar(lTexts 'lessp)
		frmTT->nMinHeight = car(car(lTexts))
		frmTT->nMaxHeight = car(car(last(lTexts)))
		frmTT->tProgName = "TextTuneTools"
		frmTT->lLayerVis = axlVisibleGet()
		frmTT->lCurrentArea = axlWindowBoxGet()
		frmTT->commandState = "IDLE"
		frmTT->popupInfo = fnTTLayerPopupSetup()
		frmTT->textList = lTexts
		frmTT->blockInfo = nil
		;frmTT->tmpLayer = tTempLayer
		frmTT->PI = const.PI
		frmTT->transMark = nil
		;frmTT->tmpObjects = nil
		
		; for Alias
		frmTT->tDone = nil
		frmTT->tOops = nil
		frmTT->tCancel = nil
		
		frmTT->xMarkCount = 0
		frmTT->popupOrig = nil
		frmTT->popup = nil
		frmTT->popupGray = nil
		axlVisibleDesign(nil)
		
		axlVisibleLayer("BOARD GEOMETRY/OUTLINE" t)
		axlVisibleLayer("REF DES/ASSEMBLY_TOP" t)
		axlVisibleLayer("REF DES/ASSEMBLY_BOTTOM" t)
		axlVisibleLayer("PACKAGE GEOMETRY/ASSEMBLY_TOP" t)
		axlVisibleLayer("PACKAGE GEOMETRY/ASSEMBLY_BOTTOM" t)
		;axlWindowFit() ;使用此函數會造成畫面閃爍兩次
		axlShell("zoom fit")
		axlVisibleUpdate(t)
	)
)

3. 設定視窗裡面的預設值 fnTTSetFormField()

procedure(fnTTSetFormField(frmTT)
	let((tLayerName)
		;設定Form的標題名稱
		axlFormTitle(frmTT strcat(frmTT->tProgName " " tVersion))
		;設定License名稱
		if(stringp(tCompanyName) then
			axlFormColorize(frmTT "F_lblCopyright" 'text 'blue)
			axlFormSetField(frmTT "F_lblCopyright" tCompanyName)
		else
			axlFormColorize(frmTT "F_lblCopyright" 'text 'red)
			axlFormSetField(frmTT "F_lblCopyright" strcat("T" "R" "I" "A" "L" " " "V" "e" "r" "s" "i" "o" "n"))
		)
		;設定其他Form Field值
		axlFormSetField(frmTT "F_popLabelName" "refdes")
		axlFormBuildPopup(frmTT "F_popLabelLayer" frmTT->popupInfo["refdes"]) 
		axlFormSetField(frmTT "F_popLabelLayer" cadar(frmTT->popupInfo["refdes"])) 
		axlFormBuildPopup(frmTT "F_popOutlineLayer" frmTT->popupInfo["package_geom"]) 
		axlFormSetField(frmTT "F_popOutlineLayer" cadar(frmTT->popupInfo["package_geom"])) 
		axlFormSetField(frmTT "F_ckbRotateText" t)
		axlFormSetField(frmTT "F_ckbCenterText" nil) 
		axlFormSetField(frmTT "F_ckbFitText" nil) 
		axlFormSetField(frmTT "F_iptDx" 0.0) 
		axlFormSetField(frmTT "F_iptDy" 0.0) 
		axlFormSetFieldEditable(frmTT "F_iptDx" nil)
		axlFormSetFieldEditable(frmTT "F_iptDy" nil) 
		axlFormSetField(frmTT "F_barMinTextBlock" 1) 
		axlFormSetField(frmTT "F_barMaxTextBlock" length(frmTT->textList)) 
		axlFormSetField(frmTT "F_rdoTextFitByHeight" t) 
		axlFormSetFieldEditable(frmTT "F_iptMinTextHeight" t)
		axlFormSetFieldEditable(frmTT "F_iptMaxTextHeight" t) 
		;nMinValue = axlMKSConvert("0.5 MM" car(axlDBGetDesignUnits()))
		;nMaxValue = axlMKSConvert("15  MM" car(axlDBGetDesignUnits()))
		axlFormSetField(frmTT "F_iptMinTextHeight" frmTT->nMinHeight) 
		axlFormSetField(frmTT "F_iptMaxTextHeight" frmTT->nMaxHeight)
		frmTT->blockInfo = fnTTGetBlockInfo(frmTT->nMinHeight frmTT->nMaxHeight "height_mode")
		axlFormSetFieldEditable(frmTT "F_barMinTextBlock" nil) 
		axlFormSetFieldEditable(frmTT "F_barMaxTextBlock" nil) 
		axlFormSetField(frmTT "F_barMinTextBlock" 1)
		axlFormSetField(frmTT "F_barMaxTextBlock" length(frmTT->textList))
		;axlFormSetField(frmTT "F_rdoMirrorBottomOnly" t)
		axlFormSetField(frmTT "F_chkMirrorBottomOnly" t)
		axlFormSetField(frmTT "F_rdoTextRotationLongSide" t) 
		axlFormSetField(frmTT "F_popTopLongSideX" "0") 
		axlFormSetField(frmTT "F_popTopLongSideY" "90") 
		axlFormSetField(frmTT "F_popBottomLongSideX" "0")
		axlFormSetField(frmTT "F_popBottomLongSideY" "270") 
		axlFormSetFieldEditable(frmTT "F_popForceAngle" nil) 
		axlFormSetField(frmTT "F_popForceAngle" "0") 
		axlFormSetField(frmTT "F_iptOffsetCorrection" 0.0) 
		axlFormSetField(frmTT "F_iptBoundaryClearance" 0.0)
		axlFormSetField(frmTT "text_mirror_bottom_side" t)
		
		tLayerName = "REF DES/ASSEMBLY_TOP"
		axlSetActiveLayer(tLayerName)
		axlFormSetField(frmTT "F_clrTop" fnTTGetLayerColor(tLayerName))
		axlFormSetField(frmTT "F_clrTop" t)
		
		tLayerName = "REF DES/ASSEMBLY_BOTTOM"
		axlFormSetField(frmTT "F_clrBottom" fnTTGetLayerColor(tLayerName))
		axlFormSetField(frmTT "F_clrBottom" t)
		fnTTUpdateFormField(frmTT)
		;===== for Option TAB
		axlFormSetField(frmTT "F_chkRestoreView" t)
		axlFormSetField(frmTT "F_barTextBlk" 1)
		oTextParam = axlGetParam("paramTextBlock:1")
		axlFormSetField(frmTT "F_iptWidth" oTextParam->width)
		axlFormSetField(frmTT "F_iptHeight" oTextParam->height)
		axlFormSetField(frmTT "F_iptLineSpace" oTextParam->lineSpace)
		axlFormSetField(frmTT "F_iptPhotoWidth" oTextParam->photoWidth)
		axlFormSetField(frmTT "F_iptCharSpace" oTextParam->charSpace)
					
		axlFormDisplay(frmTT) 
	)
)

4. fnTTUpdateFormField()

procedure(fnTTUpdateFormField(frmTT)
	let(()
		if(axlFormGetField(frmTT "F_ckbRotateText") then
			axlFormSetFieldEditable(frmTT "F_rdoTextRotationLongSide" t)
			axlFormSetFieldEditable(frmTT "F_rdoTextRotationForceAngle" t)
			axlFormSetFieldEditable(frmTT "F_rdoTextRotationLabelAngle" t)
			when(axlFormGetField(frmTT "F_rdoTextRotationLongSide")
				axlFormSetFieldEditable(frmTT "F_popTopLongSideX" t) 
				axlFormSetFieldEditable(frmTT "F_popTopLongSideY" t) 
				axlFormSetFieldEditable(frmTT "F_popBottomLongSideX" t) 
				axlFormSetFieldEditable(frmTT "F_popBottomLongSideY" t)
				axlFormSetFieldEditable(frmTT "F_popForceAngle" nil)
			)
			when(axlFormGetField(frmTT "F_rdoTextRotationForceAngle")
				axlFormSetFieldEditable(frmTT "F_popTopLongSideX" nil) 
				axlFormSetFieldEditable(frmTT "F_popTopLongSideY" nil) 
				axlFormSetFieldEditable(frmTT "F_popBottomLongSideX" nil) 
				axlFormSetFieldEditable(frmTT "F_popBottomLongSideY" nil)
				axlFormSetFieldEditable(frmTT "F_popForceAngle" t)
			) 
			when(axlFormGetField(frmTT "F_rdoTextRotationLabelAngle")
				axlFormSetFieldEditable(frmTT "F_popTopLongSideX" nil) 
				axlFormSetFieldEditable(frmTT "F_popTopLongSideY" nil) 
				axlFormSetFieldEditable(frmTT "F_popBottomLongSideX" nil) 
				axlFormSetFieldEditable(frmTT "F_popBottomLongSideY" nil)
				axlFormSetFieldEditable(frmTT "F_popForceAngle" nil)
			)
		else
			axlFormSetFieldEditable(frmTT "F_rdoTextRotationLongSide" nil)
			axlFormSetFieldEditable(frmTT "F_rdoTextRotationForceAngle" nil)
			axlFormSetFieldEditable(frmTT "F_rdoTextRotationLabelAngle" nil)
			axlFormSetFieldEditable(frmTT "F_popTopLongSideX" nil) 
			axlFormSetFieldEditable(frmTT "F_popTopLongSideY" nil) 
			axlFormSetFieldEditable(frmTT "F_popBottomLongSideX" nil) 
			axlFormSetFieldEditable(frmTT "F_popBottomLongSideY" nil)
			axlFormSetFieldEditable(frmTT "F_popForceAngle" nil)
		)
		if(axlFormGetField(frmTT "F_ckbCenterText") then
			axlFormSetFieldEditable(frmTT "F_iptOffsetCorrection" t)
		else
			axlFormSetFieldEditable(frmTT "F_iptOffsetCorrection" nil)
		)
		if(axlFormGetField(frmTT "F_ckbFitText") then
			axlFormSetFieldEditable(frmTT "F_rdoTextFitByHeight" t)
			axlFormSetFieldEditable(frmTT "F_rdoTextFitByBlock" t)
			axlFormSetFieldEditable(frmTT "F_iptBoundaryClearance" t)
			if(axlFormGetField(frmTT "F_rdoTextFitByHeight") then 
				axlFormSetFieldEditable(frmTT "F_iptMinTextHeight" t) 
				axlFormSetFieldEditable(frmTT "F_iptMaxTextHeight" t) 
				axlFormSetFieldEditable(frmTT "F_barMinTextBlock" nil)
				axlFormSetFieldEditable(frmTT "F_barMaxTextBlock" nil)
			else
				axlFormSetFieldEditable(frmTT "F_iptMinTextHeight" nil) 
				axlFormSetFieldEditable(frmTT "F_iptMaxTextHeight" nil) 
				axlFormSetFieldEditable(frmTT "F_barMinTextBlock" t)
				axlFormSetFieldEditable(frmTT "F_barMaxTextBlock" t)
			)
		else
			axlFormSetFieldEditable(frmTT "F_rdoTextFitByHeight" nil)
			axlFormSetFieldEditable(frmTT "F_rdoTextFitByBlock" nil)
			axlFormSetFieldEditable(frmTT "F_iptMinTextHeight" nil) 
			axlFormSetFieldEditable(frmTT "F_iptMaxTextHeight" nil) 
			axlFormSetFieldEditable(frmTT "F_barMinTextBlock" nil)
			axlFormSetFieldEditable(frmTT "F_barMaxTextBlock" nil)
			axlFormSetFieldEditable(frmTT "F_iptBoundaryClearance" nil)
			when(axlFormGetField(frmTT "F_ckbModifyTextBlk")
				axlFormSetFieldEditable(frmTT "F_rdoTextFitByBlock" t)
				axlFormSetFieldEditable(frmTT "F_barMinTextBlock" t)
			)
		)
		
	)
)

5. 開始 fnTTStart()

procedure(fnTTStart() 
	let((lEventMask bDoFlag rEventID lbBox lComps) 
		axlUIWPrint(frmTT "Please select components...")
		;frmTT->commandState = "SELECT_AND_EXECUTE"
		printf("M-Please select components...\n")
		
		axlSetFindFilter(?enabled list("noall" "components") ?onButtons list("all"))
		gfnSetAlias(frmTT t)
		axlEventSetStartPopup('fnTTPopup) 
		lEventMask = list('STARTDRAG 'STOPDRAG 'PICK)
		bDoFlag = t
		frmTT->transMark = axlDBTransactionStart()
		while(bDoFlag 
			rEventID = axlEnterEvent(lEventMask nil nil)
			axlClearDynamics() 
			caseq(rEventID->type
				(STARTDRAG 
					axlAddSimpleRbandDynamics(rEventID->xy "box" ?origin 0.0:0.0) 
					lbBox = rEventID->xy
				) 
				(STOPDRAG 
					lComps = list()
					lbBox = list(lbBox rEventID->xy)
					axlSingleSelectBox(lbBox) 
					lComps = axlGetSelSet()
					when(lComps 
						axlDBTransactionMark(frmTT->transMark)
						frmTT->xMarkCount = frmTT->xMarkCount + 1
						fnTTModifyText(lComps)
					) 
					lbBox = nil
					axlClearSelSet()
					fnTTCheckPopup(frmTT)
				) 
				(PICK 
					lComps = list()
					lbBox = nil
					axlSingleSelectPoint(rEventID->xy)
					lComps = axlGetSelSet()
					when(lComps 
						axlDBTransactionMark(frmTT->transMark)
						frmTT->xMarkCount = frmTT->xMarkCount + 1
						fnTTModifyText(lComps)
					) 
					axlClearSelSet()
					fnTTCheckPopup(frmTT)
				) 
				(DONE 
					bDoFlag = nil
					frmTT->commandState = "IDLE"
				)
				(CANCEL 
					bDoFlag = nil
					frmTT->commandState = "IDLE"
				)
			)
			
		)
		gfnSetAlias(frmTT)
		axlEventSetStartPopup()
		printf("M-Exit.")
	)
)

6. 浮動視窗  fnTTPopup(), fnTTCheckPopup(), fnTTPopupCancel(), fnTTPopupDone(), fnTTPopupOops(), gfnPopupUndoTimes()

procedure(fnTTPopup(event) 
	let(() 
		event = event
		frmTT->popupOrig = axlUIPopupDefine(nil 
			list(list("Done" 'fnTTPopupDone) 
				list("Oops" 'fnTTPopupOops) 
				list("Cancel" 'fnTTPopupCancel)
			)
		)
		frmTT->popupGray = axlUIPopupDefine(nil
			list(list("Done" 'fnTTPopupDone)
				;list("Oops" 'fnTTPopupOops)
				list("Cancel" 'fnTTPopupCancel)
			)
		)
		frmTT->popup = axlUIPopupDefine(nil 
			list(list("Done" 'fnTTPopupDone) 
				list("Oops" 'fnTTPopupOops) 
				list("Cancel" 'fnTTPopupCancel)
			)
		)
		axlUICmdPopupSet(frmTT->popupOrig)
		if(frmTT->xMarkCount >= 1 then
			axlUIPopupSet(frmTT->popup)
		else
			axlUIPopupSet(frmTT->popupGray)
		)
	)
)
procedure(fnTTCheckPopup(frmTT)
	;解決執行Oops後Popup變成灰色的
	axlUICmdPopupSet(frmTT->popupOrig)
	cond(
		(frmTT->xMarkCount >= 1
			axlUIPopupSet(frmTT->popup)
		)
		(t
			axlUIPopupSet(frmTT->popupGray)
		)
	)
)
procedure(fnTTPopupDone()
	when(frmTT->transMark
		axlDBTransactionCommit(frmTT->transMark)
	)
	axlFinishEnterFun() 
	axlUIPopupSet(nil) 
	axlClearDynamics()
	when(frmTT->tDone
		axlSetAlias(frmTT->tDone "done")
	)
	when(frmTT->tCancel
		axlSetAlias(frmTT->tCancel "cancel")
	)
	when(frmTT->tOops
		axlSetAlias(frmTT->tOops "oops")
	)
	fnTTExit(frmTT)
	;axlShell("done")
)
procedure(fnTTPopupOops()
	gfnPopupUndoTimes(frmTT)
	fnTTCheckPopup(frmTT)
	printf("M-Oops\n")
)
procedure(fnTTPopupCancel()
	when(frmTT->transMark
		axlDBTransactionRollback(frmTT->transMark) 
	)
	axlCancelEnterFun() 
	axlUIPopupSet(nil) 
	axlClearDynamics()
	when(frmTT->tDone
		axlSetAlias(frmTT->tDone "done")
	)
	when(frmTT->tCancel
		axlSetAlias(frmTT->tCancel "cancel")
	)
	when(frmTT->tOops
		axlSetAlias(frmTT->tOops "oops")
	)
	fnTTExit(frmTT)
	;axlShell("cancel")
)

7. 改變文字 fnTTModifyText()

procedure(fnTTModifyText(lComps) 
	let((dOne dTextInst dTextDef lTextXY tTextBlock text_rotation_new nTextRotationDef text_justify text_mirror my_orient result
		lSymBoxCenter lSymInstData lSymDefData tTextValue tTextLayer bOkToProceed tOldTextBlk) 
		foreach(dOne lComps ;dOne = nth(0 lComps)
			bOkToProceed = nil 
			dTextInst = fnTTGetTextData(dOne "instance")
			dTextDef = fnTTGetTextData(dOne "definition")
			lSymInstData = fnTTGetSymData(dOne "instance")
			lSymDefData = fnTTGetSymData(dOne "definition")
			cond(
				(!listp(dTextInst)
					if(dTextInst && lSymInstData then 
						tTextValue = dTextInst->text
						tTextLayer = dTextInst->layer
						lTextXY = dTextInst->xy
						text_justify = dTextInst->justify
						tOldTextBlk = tTextBlock = dTextInst->textBlock
						text_mirror = dTextInst->isMirrored
						text_rotation_new = dTextInst->rotation
						nTextRotationDef = dTextDef->rotation
						unless(nTextRotationDef
							nTextRotationDef = 0.0
							printf("W-Comp = %L ,Text define rotation null\n" dOne->name)
						)
						when(axlFormGetField(frmTT "F_ckbRotateText") 
							bOkToProceed = t
							text_rotation_new = fnTTCalculateTextRotation(lSymInstData lSymDefData dTextInst dTextDef)
						) 
						when(axlFormGetField(frmTT "F_ckbCenterText") 
							bOkToProceed = t
							text_justify = "CENTER"
							lSymBoxCenter = car(lSymInstData)
							lTextXY = fnTTOffsetCorrection(lSymBoxCenter tTextBlock text_rotation_new)
						)
						when(axlFormGetField(frmTT "F_ckbModifyTextBlk") && !axlFormGetField(frmTT "F_ckbFitText")
							bOkToProceed = t
							result = fnTTCalculateTextBlock(lSymInstData lSymDefData tTextValue text_rotation_new nTextRotationDef)
							lTextXY = car(result)
							tTextBlock = cadr(result)
							
							when(stringp(tOldTextBlk) && stringp(tTextBlock)
								axlUIWPrint(frmTT "Changed From %s to %s" tOldTextBlk tTextBlock)
							)
						)  
						when(axlFormGetField(frmTT "F_ckbFitText")
							bOkToProceed = t
							result = fnTTCalculateTextBlock(lSymInstData lSymDefData tTextValue text_rotation_new nTextRotationDef)
							lTextXY = car(result)
							tTextBlock = cadr(result)
						)
						unless(bOkToProceed 
							printf("M-Please select at least one item from \"Mode\" options\n")
						) 
						when(bOkToProceed 
							if(axlFormGetField(frmTT "F_chkMirrorBottomOnly") then
								if(dOne->symbol->isMirrored then
									text_mirror = t
								else
									text_mirror = nil
								)
							else
							;when(axlFormGetField(frmTT "F_rdoNoMirror") 
								text_mirror = nil
							) 
							my_orient = make_axlTextOrientation(?textBlock tTextBlock ?rotation text_rotation_new ?mirrored text_mirror ?justify text_justify)
							axlDeleteObject(dTextInst)
							result = axlDBCreateText(tTextValue lTextXY my_orient tTextLayer dOne->symbol)
							axlDBRefreshId(dOne->symbol)
							axlDBRefreshId(dOne) 
							unless(result 
								printf("E-Could not create Text for %s\n" dOne->name)
							)
						)
						when(axlFormGetField(frmTT "F_ckbDisplayTextBlk") && !axlFormGetField(frmTT "F_ckbModifyTextBlk")
							when(stringp(tTextBlock)
								axlUIWPrint(frmTT "TextBlk: %s" tTextBlock)
							)
						)
					else 
						printf("W-Data not valid for component %s, check text label and/or outline data corresponding to selected options\n" (dOne->name))
					)
				)
				(length(dTextInst) >= 2
					xIndex = 0
					foreach(dText dTextInst ;dText = nth(0 dTextInst) dText->??
						
						bOkToProceed = nil
						tTextValue =dText->text
						tTextLayer = dText->layer
						lTextXY = dText->xy
						text_justify = dText->justify
						tOldTextBlk = tTextBlock = dText->textBlock
						text_mirror = dText->isMirrored
						dParent = dText->parent
						text_rotation_new = dText->rotation
						nTextRotationDef = nth(xIndex dTextDef)->rotation
						unless(nTextRotationDef
							nTextRotationDef = 0.0
						)
						;text_inst_dbid1 = fnTTGetTextData(dText "instance")
						;text_def_dbid1 = fnTTGetTextData(dText "definition")
						lSymDefData = lSymInstData = fnTTGetPinData(dParent "instance")
						;printf("1-tTextValue=%L, lTextXY=%L, my_orient=%L, tTextLayer=%L, dParent=%L\n" tTextValue lTextXY my_orient tTextLayer dParent)
						when(axlFormGetField(frmTT "F_ckbRotateText") 
							bOkToProceed = t
							text_rotation_new = fnTTCalculateTextRotation(lSymInstData lSymDefData dText dText)
						) 
						when(axlFormGetField(frmTT "F_ckbCenterText") 
							bOkToProceed = t
							text_justify = "CENTER"
							lSymBoxCenter = car(lSymInstData)
							lTextXY = fnTTOffsetCorrection(lSymBoxCenter tTextBlock text_rotation_new)
						) 
						when(axlFormGetField(frmTT "F_ckbFitText")
							bOkToProceed = t
							result = fnTTCalculateTextBlock(lSymInstData lSymDefData tTextValue text_rotation_new nTextRotationDef)
							lTextXY = car(result)
							tTextBlock = cadr(result)
						) 
						unless(bOkToProceed 
							printf("W-Please select at least one item from \"Mode\" options\n")
						) 
						when(bOkToProceed 
							if(axlFormGetField(frmTT "F_chkMirrorBottomOnly") then
								if(dOne->symbol->isMirrored then
									text_mirror = t
								else
									text_mirror = nil
								)
							else 
							;when(axlFormGetField(frmTT "F_rdoNoMirror") 
								text_mirror = nil
							) 
							my_orient = make_axlTextOrientation(?textBlock tTextBlock ?rotation text_rotation_new ?mirrored text_mirror ?justify text_justify)
							axlDeleteObject(dText)
							;printf("2-tTextValue=%L, lTextXY=%L, my_orient=%L, tTextLayer=%L, dParent=%L\n" tTextValue lTextXY my_orient tTextLayer dParent)
							result = axlDBCreateText(tTextValue lTextXY my_orient tTextLayer dParent)
							axlDBRefreshId(dParent)
							
							;unless(result 
							;	printf("Could not create Text for %s\n" dOne->name)
							;)
						)
						xIndex++
					)
					axlDBRefreshId(dOne) 
				)
				(t
					t
				)
			)
		)
	)
)

8. 計算文字的角度 fnTTCalculateTextRotation()

procedure(fnTTCalculateTextRotation(lSymInstData lSymDefData dTextInst dTextDef) 
	let((nTextRotation nTextRotationDef nRotationTopH nRotationTopV nRotationBotH nRotationBotV nTotalRotation tRotationMode bOddAngle nSymBoxWidth
		nSymBoxHeight xFactor lSymInstCorners nSymInstRotation bSymInstMirror nRotationForce) 
		
		;dTextInst = dTextInst
		;lSymDefData = lSymDefData
		nRotationTopH = atof(axlFormGetField(frmTT "F_popTopLongSideX"))
		nRotationTopV = atof(axlFormGetField(frmTT "F_popTopLongSideY"))
		nRotationBotH = atof(axlFormGetField(frmTT "F_popBottomLongSideX"))
		nRotationBotV = atof(axlFormGetField(frmTT "F_popBottomLongSideY"))
		nRotationForce = atof(axlFormGetField(frmTT "F_popForceAngle"))
		cond(
			(axlFormGetField(frmTT "F_rdoTextRotationLongSide") 
				tRotationMode = "long_side"
			) 
			(axlFormGetField(frmTT "F_rdoTextRotationLabelAngle") 
				tRotationMode = "label_angle"
			) 
			(axlFormGetField(frmTT "F_rdoTextRotationForceAngle") 
				tRotationMode = "F_popForceAngle"
			)
		) 
		lSymInstCorners = cadr(lSymInstData)
		nSymInstRotation = caddr(lSymInstData)
		bSymInstMirror = nth(3 lSymInstData)
		unless(((nSymInstRotation == 0.0) || (nSymInstRotation == 90.0) || (nSymInstRotation == 180.0) || (nSymInstRotation == 270.0)) 
			bOddAngle = t
		) 
		;bOddAngle = bOddAngle 
		case(tRotationMode 
			("long_side" 
				nSymBoxHeight = abs((cadr(upperRight(lSymInstCorners)) - cadr(lowerLeft(lSymInstCorners))))
				nSymBoxWidth = abs((car(upperRight(lSymInstCorners)) - car(lowerLeft(lSymInstCorners))))
				xFactor = cadr(axlDBGetDesignUnits())
				nSymBoxWidth = nSymBoxWidth + (1.0 / (10.0**xFactor))
				if((nSymBoxHeight - nSymBoxWidth) > 0.0 then 
					if(bSymInstMirror then 
						nTextRotation = nRotationBotV
					else
						nTextRotation = nRotationTopV
					)
				else 
					if(bSymInstMirror then 
						nTextRotation = nRotationBotH
					else
						nTextRotation = nRotationTopH
					)
				)
			) 
			("label_angle" 
				nTextRotationDef = dTextDef->rotation
				unless(nTextRotationDef
					nTextRotationDef = 0.0
					printf("W-Text Define rotation null.\n")
				)
				nTotalRotation = nSymInstRotation + nTextRotationDef
				nTotalRotation = nTotalRotation * 10.0
				nTotalRotation = round(nTotalRotation)
				nTotalRotation = nTotalRotation / 10.0
				when(nTotalRotation >= 360.0
					nTotalRotation = nTotalRotation - 360.0
				) 
				if(bSymInstMirror && axlFormGetField(frmTT "F_chkMirrorBottomOnly") then 
					cond(
						((nTotalRotation >= 0.0) && (nTotalRotation <= 45.0)
							nTextRotation = nTotalRotation
						) 
						((nTotalRotation > 45.0) && (nTotalRotation <= 225.0)
							nTextRotation = nTotalRotation + 180.0
							when(nTextRotation >= 360.0
								nTextRotation = nTextRotation - 360.0
							)
						) 
						((nTotalRotation > 225.0) && (nTotalRotation <= 360.0)
							nTextRotation = nTotalRotation
						)
					)
				else 
					cond(
						((nTotalRotation >= 0.0) && (nTotalRotation < 135.0)
							nTextRotation = nTotalRotation
						) 
						((nTotalRotation >= 135.0) && (nTotalRotation < 315.0)
							nTextRotation = nTotalRotation + 180.0
							when(nTextRotation >= 360.0
								nTextRotation = nTextRotation - 360.0
							)
						) 
						((nTotalRotation >= 315.0) && (nTotalRotation <= 360.0)
							nTextRotation = nTotalRotation
						)
					)
				)
			) 
			("F_popForceAngle" 
				nTextRotation = nRotationForce
			)
		)
		;printf("nTextRotation=%L\n" nTextRotation)
		nTextRotation
	)
)

9. 取得層面的顏色 fnTTGetLayerColor()

procedure(fnTTGetLayerColor(tLayer) 
	prog((oLayer)
		when(axlIsLayer(tLayer) 
			oLayer = axlLayerGet(tLayer) 
			return(oLayer->color)
		)
		return(nil)
	)
)

10. 取得PIN的資訊 fnTTGetPinData()

procedure(fnTTGetPinData(dComp sym_type) 
	let((tOutlineLayerTop tOutlineLayerBottom tOutlineLayer dSymbol list_of_boxes
		box_corners box_center ret_list pp pm x y x_ll y_ll x_ul y_ul rotation mirror)
		
		tOutlineLayerTop = strcat(axlFormGetField(frmTT "F_popOutlineLayer") "TOP")
		tOutlineLayerBottom = strcat(axlFormGetField(frmTT "F_popOutlineLayer") "BOTTOM")
		
		case(sym_type 
			("instance" 
				dSymbol = dComp
				if(dSymbol->isMirrored then 
					tOutlineLayer = tOutlineLayerBottom
				else
					tOutlineLayer = tOutlineLayerTop
				)
			) 
			;("definition" 
			;	dSymbol = (dComp->symbol->definition)
			;	tOutlineLayer = tOutlineLayerTop
			;) 
			;(t)
		) 
		if(dSymbol then 
			;foreach(dChildren (dSymbol->children) 
			;	when(((dChildren->layer) && (upperCase((dChildren->layer)) == tOutlineLayer)) 
			;		when((((dChildren->objType) == "path") || ((dChildren->objType) == "shape") || ((dChildren->objType) == "polygon")) 
			;			(list_of_boxes = cons((dChildren->bBox) list_of_boxes))
			;		)
			;	)
			;)
			list_of_boxes = cons(dSymbol->bBox list_of_boxes) 
			if(length(list_of_boxes) > 0 then 
				box_corners = fnTTGetMaxExtents(list_of_boxes)
				box_center = fnTTGetBoxCenter(box_corners)
				rotation = dSymbol->rotation
				mirror = dSymbol->isMirrored
			else
				pp = 1.0 / (10**cadr(axlDBGetDesignUnits()))
				pm = pp * -1.0
				if(dSymbol->xy then 
					x = car(dSymbol->xy)
					y = cadr(dSymbol->xy)
					x_ll = x - pp
					y_ll = y - pp
					x_ul = x + pp
					y_ul = y + pp
					box_corners = list((x_ll:y_ll) (x_ul:y_ul))
					box_center = dSymbol->xy
					rotation = dSymbol->rotation
					mirror = dSymbol->isMirrored
				else
					printf("W-no outline data found for component:%s\n" dComp->name) 
					box_corners = list((pm:pm) (pp:pp))
					box_center = nil
					rotation = nil
					mirror = nil
				)
			) 
			ret_list = list(box_center box_corners rotation mirror)
		else 
			printf("W-Symbol %s of %s, cannot extract outline data on layer %s\n" sym_type (dComp->name) tOutlineLayer) 
			ret_list = nil
		)
		ret_list
	)
)

11. 取得SYMBOL的資訊 fnTTGetSymData()

procedure(fnTTGetSymData(dComp sym_type) 
	let((tOutlineLayerTop tOutlineLayerBottom tOutlineLayer dSymbol list_of_boxes
		box_corners box_center ret_list pp pm x y x_ll y_ll x_ul y_ul rotation mirror)
		
		if(axlFormGetField(frmTT "F_popOutlineLayer") == "PIN/" then
			tOutlineLayerTop = "PACKAGE GEOMETRY/SILKSCREEN_TOP"
			tOutlineLayerBottom = "PACKAGE GEOMETRY/SILKSCREEN_BOTTOM"
		else
			tOutlineLayerTop = strcat(axlFormGetField(frmTT "F_popOutlineLayer") "TOP")
			tOutlineLayerBottom = strcat(axlFormGetField(frmTT "F_popOutlineLayer") "BOTTOM")
		)
		
		case(sym_type 
			("instance" 
				dSymbol = dComp->symbol
				if(dSymbol->isMirrored then 
					tOutlineLayer = tOutlineLayerBottom
				else
					tOutlineLayer = tOutlineLayerTop
				)
			) 
			("definition" 
				dSymbol = dComp->symbol->definition 
				tOutlineLayer = tOutlineLayerTop
			) 
			(t
				t
			)
		) 
		if(dSymbol then 
			foreach(dChildren dSymbol->children
				when(dChildren->layer && (upperCase(dChildren->layer) == tOutlineLayer) 
					when(((dChildren->objType == "path") || (dChildren->objType == "shape") || (dChildren->objType == "polygon")) 
						list_of_boxes = cons(dChildren->bBox list_of_boxes)
					)
				)
			) 
			if(length(list_of_boxes) > 0 then 
				box_corners = fnTTGetMaxExtents(list_of_boxes)
				box_center = fnTTGetBoxCenter(box_corners)
				rotation = dSymbol->rotation
				mirror = dSymbol->isMirrored
			else
				pp = 1.0 / (10**cadr(axlDBGetDesignUnits()))
				pm = pp * -1.0
				if(dSymbol->xy then 
					x = car(dSymbol->xy)
					y = cadr(dSymbol->xy)
					x_ll = x - pp
					y_ll = y - pp
					x_ul = x + pp
					y_ul = y + pp
					box_corners = list((x_ll:y_ll) (x_ul:y_ul))
					box_center = dSymbol->xy
					rotation = dSymbol->rotation
					mirror = dSymbol->isMirrored
				else
					printf("W-no outline data found for component:%s\n" dComp->name) 
					box_corners = list((pm:pm) (pp:pp))
					box_center = nil
					rotation = nil
					mirror = nil
				)
			) 
			ret_list = list(box_center box_corners rotation mirror)
		else 
			printf("W-Symbol %s of %s, cannot extract outline data on layer %s\n" sym_type (dComp->name) tOutlineLayer) 
			ret_list = nil
		)
		ret_list
	)
)

12. 取得TEXT的資訊 fnTTGetTextData()

procedure(fnTTGetTextData(dComp sym_type) 
	let((tTextLayerTop tTextLayerBottom tTextLayer dText dSymbol gReturnValue tNumber lText lTextValue)
		if(axlFormGetField(frmTT "F_popLabelLayer") == "PACKAGE GEOMETRY/PIN_NUMBER" then
			tTextLayer = axlFormGetField(frmTT "F_popLabelLayer")
			lTextValue = nil
			;printf("dComp=%L\n" dComp->??)
			when(dComp->pins
				foreach(dOne dComp->pins ;dOne = nth(0 dComp->pins)
					tNumber = dOne->number
					lText = axlDBGetAttachedText(dOne)
					foreach(dText lText
						when(upperCase(dText->layer) == tTextLayer
							lTextValue = cons(dText lTextValue)
						)
					)
				)
			)
			gReturnValue = lTextValue
		else
			tTextLayerTop = strcat(axlFormGetField(frmTT "F_popLabelLayer") "TOP") 
			tTextLayerBottom = strcat(axlFormGetField(frmTT "F_popLabelLayer") "BOTTOM")
		
			case(sym_type 
				("instance" 
					dSymbol = dComp->symbol 
					if(dSymbol->isMirrored then 
						tTextLayer = tTextLayerBottom
					else
						tTextLayer = tTextLayerTop
					)
				) 
				("definition" 
					dSymbol = dComp->symbol->definition 
					tTextLayer = tTextLayerTop
				)
			) 
			foreach(dChildren dSymbol->children ;dChildren = nth(0 dSymbol->children) dChildren->??
				when((dChildren->objType == "text") && (upperCase(dChildren->layer) == tTextLayer) 
					dText = dChildren
				)
			)
			if(dText then 
				gReturnValue = dText
			else
				printf("W-Symbol %s of %s, cannot extract label on layer %s\n" sym_type dComp->name tTextLayer)
				gReturnValue = nil
			)
		)
		;printf("gReturnValue=%L\n" gReturnValue)
		gReturnValue
	)
)

13. 計算文字是屬於哪一個Block fnTTCalculateTextBlock() 

procedure(fnTTCalculateTextBlock(lSymInstData lSymDefData tTextValue nTextRotation nTextRotationDef) 
	let((lSymBoxCorners lSymBoxCenter lTextXY tTextBlock nBlock nBlockHeight nBlockWidth nBlockSpace bLoop xCharCount
		nTextWidth nTextHeight nBoundaryClearance nMaxTextWidth nMaxTextHeight nSymBoxWidth nSymBoxHeight xCount xFitCount
		nNewTextWidth tTextWidth nNewTextHeight tTextHeight nNewMaxTextWidth tMaxTextWidth nNewMaxTextHeight tMaxTextHeight)
		
		lSymBoxCenter = car(lSymInstData) 
		cond(
			((axlFormGetField(frmTT "F_rdoTextRotationLongSide") || axlFormGetField(frmTT "F_rdoTextRotationForceAngle")) 
				lSymBoxCorners = cadr(lSymInstData)
				nSymBoxWidth = abs((car(upperRight(lSymBoxCorners)) - car(lowerLeft(lSymBoxCorners))))
				nSymBoxHeight = abs((cadr(upperRight(lSymBoxCorners)) - cadr(lowerLeft(lSymBoxCorners))))
				if(zerop(round(nTextRotation)) || (round(nTextRotation) == 180) then 
					nMaxTextWidth = nSymBoxWidth
					nMaxTextHeight = nSymBoxHeight
				else
					nMaxTextWidth = nSymBoxHeight
					nMaxTextHeight = nSymBoxWidth
				)
			) 
			(axlFormGetField(frmTT "F_rdoTextRotationLabelAngle") 
				lSymBoxCorners = cadr(lSymDefData)
				nSymBoxWidth = abs((car(upperRight(lSymBoxCorners)) - car(lowerLeft(lSymBoxCorners))))
				nSymBoxHeight = abs((cadr(upperRight(lSymBoxCorners)) - cadr(lowerLeft(lSymBoxCorners)))) 
				cond(
					((nTextRotationDef >= 0.0) && (nTextRotationDef <= 45.0) 
						nMaxTextWidth = nSymBoxWidth 
						nMaxTextHeight = nSymBoxHeight
					) 
					((nTextRotationDef > 45.0) && (nTextRotationDef < 135.0)
						nMaxTextWidth = nSymBoxHeight 
						nMaxTextHeight = nSymBoxWidth
					) 
					((nTextRotationDef >= 135.0) && (nTextRotationDef <= 225.0)
						nMaxTextWidth = nSymBoxWidth 
						nMaxTextHeight = nSymBoxHeight
					) 
					((nTextRotationDef > 225.0) && (nTextRotationDef < 315.0)
						nMaxTextWidth = nSymBoxHeight 
						nMaxTextHeight = nSymBoxWidth
					) 
					((nTextRotationDef >= 315.0) && (nTextRotationDef <= 360.0)
						nMaxTextWidth = nSymBoxWidth 
						nMaxTextHeight = nSymBoxHeight
					)
				)
			) 
			(t t)
		)
		if(axlFormGetField(frmTT "F_ckbModifyTextBlk") && !axlFormGetField(frmTT "F_ckbFitText") then
			;axlFormGetField(frmTT "F_rdoTextFitByBlock") && (axlFormGetField(frmTT "F_barMinTextBlock") == axlFormGetField(frmTT "F_barMaxTextBlock")) then
			nBlock = axlFormGetField(frmTT "F_barMinTextBlock")
		else
			xFitCount = nil
			xCount = 0 
			bLoop = t
			while(bLoop 
				if(frmTT->blockInfo[xCount] then 
					nBlockHeight = cadr(frmTT->blockInfo[xCount]) 
					nBlockWidth = caddr(frmTT->blockInfo[xCount]) 
					nBlockSpace = nth(3 frmTT->blockInfo[xCount])
					xCharCount = strlen(tTextValue) 
					nTextWidth = (xCharCount * nBlockWidth) + ((xCharCount - 1) * nBlockSpace) 
					nTextHeight = nBlockHeight
					nBoundaryClearance = axlFormGetField(frmTT "F_iptBoundaryClearance")
					when(nBoundaryClearance > 0.0
						nTextWidth = nTextWidth + (2 * nBoundaryClearance)
						nTextHeight = nTextHeight + (2 * nBoundaryClearance)
					)
					;printf("Value=%L, nTextWidth=%L, nMaxTextWidth=%L, nTextHeight=%L, nMaxTextHeight=%L\n" tTextValue nTextWidth nMaxTextWidth nTextHeight nMaxTextHeight)
					;修正有一些數字判斷會錯誤,所以先將數字轉為字串再轉回數字
					sprintf(tTextWidth "%f" nTextWidth)
					sprintf(tTextHeight "%f" nTextHeight)
					sprintf(tMaxTextWidth "%f" nMaxTextWidth)
					sprintf(tMaxTextHeight "%f" nMaxTextHeight)
					nNewTextWidth = atof(tTextWidth)
					nNewTextHeight = atof(tTextHeight)
					nNewMaxTextWidth = atof(tMaxTextWidth)
					nNewMaxTextHeight = atof(tMaxTextHeight)
					;printf("Value=%L, nTextWidth=%L, nMaxTextWidth=%L, nTextHeight=%L, nMaxTextHeight=%L\n" tTextValue nNewTextWidth nNewMaxTextWidth nNewTextHeight nNewMaxTextHeight)
					if(((nNewTextWidth >= nNewMaxTextWidth) || (nNewTextHeight >= nNewMaxTextHeight)) then 
						bLoop = nil
					else
						xFitCount = xCount
						++xCount
					)
					when(xCount >= axlDBControl('maxTextBlock)
						bLoop = nil
					)
				else
					bLoop = nil
				)
			) 
			if(xFitCount then
				if(xFitCount >= axlDBControl('maxTextBlock) then
					nBlock = car(frmTT->blockInfo[0])
					nBlockHeight = cadr(frmTT->blockInfo[0]) 
					printf("W-Cannot fit text within text %s(%L,%L), using minimum block %d with height %.4f\n" tTextValue nMaxTextWidth nMaxTextHeight nBlock nBlockHeight)
				else
					nBlock = car(frmTT->blockInfo[xFitCount])
				)
			else
				nBlock = car(frmTT->blockInfo[0])
				nBlockHeight = cadr(frmTT->blockInfo[0]) 
				printf("W-Cannot fit text within text %s(%L,%L), using minimum block %d with height %.4f\n" tTextValue nMaxTextWidth nMaxTextHeight nBlock nBlockHeight)
			)
		) 
		tTextBlock = sprintf(nil "%d" nBlock)
		lTextXY = fnTTOffsetCorrection(lSymBoxCenter tTextBlock nTextRotation) 
		list(lTextXY tTextBlock)
	)
)

14. fnTTGetMaxExtents()

procedure(fnTTGetMaxExtents(lBox) 
	let((x_ll y_ll x_ur y_ur ret_list) 
		foreach(b lBox 
			unless(x_ll 
				x_ll = car(lowerLeft(b))
			) 
			unless(y_ll 
				y_ll = cadr(lowerLeft(b))
			) 
			unless(x_ur 
				x_ur = car(upperRight(b))
			)
			unless(y_ur 
				y_ur = cadr(upperRight(b))
			) 
			when(car(lowerLeft(b)) < x_ll
				x_ll = car(lowerLeft(b))
			) 
			when(cadr(lowerLeft(b)) < y_ll
				y_ll = cadr(lowerLeft(b))
			) 
			when(car(upperRight(b)) > x_ur
				x_ur = car(upperRight(b))
			) 
			when(cadr(upperRight(b)) > y_ur
				y_ur = cadr(upperRight(b))
			)
		) 
		ret_list = list((x_ll:y_ll) (x_ur:y_ur))
		ret_list
	)
)

15. fnTTGetBoxCenter()

procedure(fnTTGetBoxCenter(lBox) 
	let((x_ll y_ll x_ur y_ur x_center y_center ret) 
		x_ll = car(lowerLeft(lBox))
		y_ll = cadr(lowerLeft(lBox))
		x_ur = car(upperRight(lBox)) 
		y_ur = cadr(upperRight(lBox))
		foreach(xy lBox 
			when(car(xy) < x_ll
				x_ll = car(xy)
			) 
			when(cadr(xy) < y_ll
				y_ll = cadr(xy)
			)
			when(car(xy) > x_ur
				x_ur = car(xy)
			)
			when(cadr(xy) > y_ur
				y_ur = cadr(xy)
			)
		) 
		x_ll = x_ll * 1.0
		y_ll = y_ll * 1.0
		x_ur = x_ur * 1.0
		y_ur = y_ur * 1.0
		x_center = x_ll + ((x_ur - x_ll) / 2.0)
		y_center = y_ll + ((y_ur - y_ll) / 2.0)
		ret = x_center:y_center
		ret
	)
)

16. fnTTOffsetCorrection()

procedure(fnTTOffsetCorrection(lTextXY tTextBlock nTextRotation) 
	let((nCorrectionFactor nTextHeight nTextOffset nDeltaX nDeltaY
		nAngle nTextX nTextY nPI oTextParam nUserDx nUserDy) 
		
		oTextParam = axlGetParam(strcat("paramTextBlock:" tTextBlock))
		nPI = frmTT->PI
		nCorrectionFactor = axlFormGetField(frmTT "F_iptOffsetCorrection")
		nUserDx = axlFormGetField(frmTT "F_iptDx")
		nUserDy = axlFormGetField(frmTT "F_iptDy")
		nTextHeight = oTextParam->height
		nTextOffset = (nTextHeight / 2.0) - (nTextHeight * nCorrectionFactor)
		cond(
			((nTextRotation >= 0.0) && (nTextRotation <= 90.0)
				nAngle = (nTextRotation / 180.0) * nPI
				nDeltaX = abs((cos(((nPI / 2) - nAngle)) * nTextOffset))
				nDeltaY = -abs((sin(((nPI / 2) - nAngle)) * nTextOffset))
			) 
			((nTextRotation > 90.0) && (nTextRotation <= 180.0)
				nAngle = ((180.0 - nTextRotation) / 180.0) * nPI
				nDeltaX = abs(cos(((nPI / 2) - nAngle)) * nTextOffset)
				nDeltaY = abs(sin(((nPI / 2) - nAngle)) * nTextOffset)
			) 
			((nTextRotation > 180.0) && (nTextRotation <= 270.0)
				nAngle = ((nTextRotation - 180.0) / 180.0) * nPI
				nDeltaX = -abs(cos(((nPI / 2) - nAngle)) * nTextOffset)
				nDeltaY = abs(sin(((nPI / 2) - nAngle)) * nTextOffset)
			) 
			((nTextRotation > 270.0) && (nTextRotation <= 360.0)
				nAngle = ((360.0 - nTextRotation) / 180.0) * nPI
				nDeltaX = -abs(cos(((nPI / 2) - nAngle)) * nTextOffset)
				nDeltaY = -abs(sin(((nPI / 2) - nAngle)) * nTextOffset)
			)
		) 
		nTextX = car(lTextXY) + nDeltaX
		nTextY = cadr(lTextXY) + nDeltaY
		nTextX = nTextX + nUserDx
		nTextY = nTextY + nUserDy
		list(nTextX nTextY)
	)
)

17. fnTTLayerPopupSetup()

procedure(fnTTLayerPopupSetup() 
	let((tBaseName lBase tLayerTop tLayerBot tClass oNiceName lConfig tPkgNickName oPopupInfo tNickName lPopup lOne tClass tSubclass tName tBase) 
		oNiceName = makeTable("nice_name_table" nil)
		oNiceName["ASSEMBLY"] = "Assembly"
		oNiceName["PLACE_BOUND"] = "Place_Bound"
		oNiceName["SILKSCREEN"] = "Silkscreen"
		oNiceName["DISPLAY"] = "Display"
		oNiceName["DFA_BOUND"] = "DFA_Bound"
		oNiceName["PIN"] = "Pin"
		tPkgNickName = "package_geom"
		lConfig = list(
			list("refdes" axlMapClassName("REF DES"))
			list("value" axlMapClassName("COMPONENT VALUE")) 
			list("part_number" axlMapClassName("USER PART NUMBER")) 
			list("device_type" axlMapClassName("DEVICE TYPE")) 
			list("tolerance" axlMapClassName("TOLERANCE"))
			list("package_geo1" axlMapClassName("PACKAGE GEOMETRY"))
			list(tPkgNickName  axlMapClassName("PACKAGE GEOMETRY"))
		)
		oPopupInfo = makeTable("layer_info_table" nil)
		foreach(lOne lConfig ;讀取每一個Config的Subclass名稱
			tNickName = car(lOne)
			tClass = cadr(lOne) ;tClass = axlMapClassName("PACKAGE GEOMETRY")
			lBase = list()
			cond(
				(tNickName == "package_geo1"
					lBase = cons("PIN_NUMBER" lBase)
				)
				(t
					foreach(tSubclass axlGetParam(strcat("paramLayerGroup:" tClass))->groupMembers
						tBaseName = upperCase(tSubclass)
						when(rexMatchp("_TOP" tBaseName) || rexMatchp("_BOTTOM" tBaseName)
							;文字裡面有TOP 和BOTTOM 才執行
							rexCompile("_TOP") 
							tBaseName = rexReplace(tBaseName "" 0)
							rexCompile("_BOTTOM") 
							tBaseName = rexReplace(tBaseName "" 0)
							unless(member(tBaseName lBase) ;不是lBase的成員才執行(只又已有文字就不執行)
								lBase = cons(tBaseName lBase)
							)
						)
					) 
					lBase = sort(lBase nil)
					when(tNickName == tPkgNickName 
						lBase = remove("SOLDERMASK" lBase)
						lBase = remove("PASTEMASK" lBase)
					) 
					foreach(tName lBase
						cond(
							(tNickName == "package_geo1"
								t
							)
							(t
								tLayerTop = strcat(tClass "/" tName "_TOP")
								tLayerBot = strcat(tClass "/" tName "_BOTTOM")
								unless(axlIsLayer(tLayerTop) 
									axlLayerCreateNonConductor(tLayerTop)
								)
								unless(axlIsLayer(tLayerBot) 
									axlLayerCreateNonConductor(tLayerBot)
								)
							)
						)
					)
					
				)
			)
			lPopup = list()
			foreach(tBase lBase 
				if(oNiceName[tBase] then 
					tBaseName = oNiceName[tBase]
				else
					;將字串第一個字轉換為大寫,其他的字都小寫
					tBaseName = strcat(upperCase(substring(tBase 1 1)) lowerCase(substring(tBase 2)))
				)
				if(tNickName == "package_geo1" then
					lPopup = cons(list(tBaseName strcat(tClass "/" tBase)) lPopup)
				else
					lPopup = cons(list(tBaseName strcat(tClass "/" tBase "_")) lPopup)
				)
				
			)
			;加入PIN/TOP, PIN/BOTTOM
			when(tNickName == tPkgNickName 
				lPopup = cons(list("Pin" strcat("PIN/")) lPopup)
			)
			lPopup = reverse(lPopup)
			oPopupInfo[tNickName] = lPopup
			;printf("lPopup=%L\n" lPopup)
		)
		oPopupInfo
	)
)

18. fnTTGetBlockInfo() 

procedure(fnTTGetBlockInfo(nMinValue nMaxValue tMode) 
	let((xID aBlockInfo nCurrentHeight nCurrentBlock oTextParam xTextBlk lEntry)
		aBlockInfo = makeVector(axlDBControl('maxTextBlock) nil)
		xID = 0
		case(tMode 
			("block_mode" 
				for(xTextBlk nMinValue nMaxValue 
					oTextParam = axlGetParam(sprintf(nil "paramTextBlock:%d" xTextBlk))
					aBlockInfo[xID] = list(xTextBlk oTextParam->height oTextParam->width oTextParam->charSpace)
					++xID
				)
			) 
			("height_mode" 
				foreach(lEntry frmTT->textList 
					nCurrentHeight = car(lEntry) 
					nCurrentBlock = cadr(lEntry) 
					when((nMinValue <= nCurrentHeight) && (nCurrentHeight <= nMaxValue) 
						oTextParam = axlGetParam(sprintf(nil "paramTextBlock:%d" nCurrentBlock))
						aBlockInfo[xID] = list(nCurrentBlock oTextParam->height oTextParam->width oTextParam->charSpace)
						++xID
					)
				)
			)
		)
		aBlockInfo
	)
)

19. fnTTUpdateTextBlkValue()

procedure(fnTTUpdateTextBlkValue(frmTT bUpdateValue)
	let((tTextBlk oTextParam)
		if(bUpdateValue then
			tTextBlk = axlFormGetField(frmTT "F_barTextBlk")
			oTextParam = axlGetParam(sprintf(nil "paramTextBlock:%d" tTextBlk))
			axlFormSetField(frmTT "F_iptWidth" oTextParam->width)
			axlFormSetField(frmTT "F_iptHeight" oTextParam->height)
			axlFormSetField(frmTT "F_iptLineSpace" oTextParam->lineSpace)
			axlFormSetField(frmTT "F_iptPhotoWidth" oTextParam->photoWidth)
			axlFormSetField(frmTT "F_iptCharSpace" oTextParam->charSpace)
		else
			tTextBlk = axlFormGetField(frmTT "F_barTextBlk")
			oTextParam = axlGetParam(sprintf(nil "paramTextBlock:%d" tTextBlk))
			oTextParam->width = axlFormGetField(frmTT "F_iptWidth")
			oTextParam->height = axlFormGetField(frmTT "F_iptHeight")
			oTextParam->lineSpace = axlFormGetField(frmTT "F_iptLineSpace")
			oTextParam->photoWidth = axlFormGetField(frmTT "F_iptPhotoWidth")
			oTextParam->charSpace = axlFormGetField(frmTT "F_iptCharSpace")
			axlSetParam(oTextParam)
			axlVisibleUpdate(nil)
		)
	)
)

20. gfnSetAlias()

unless(fboundp('gfnSetAlias)
	procedure(gfnSetAlias(rFormmID @optional (bSet nil))
		let((tOne)
			if(bSet then
				foreach(tOne axlGetAlias(nil) ;tOne = nth(0 lAllAlias)
					case(axlGetAlias(tOne)
						("done" || "Done"
							axlSetAlias(tOne "pop Done")
							rFormmID->tDone = tOne
						)
						("cancel" || "Cancel"
							axlSetAlias(tOne "pop Cancel") ; Set quick function "Esc" in popup memu
							rFormmID->tCancel = tOne
						)
						("oops" || "Oops"
							axlSetAlias(tOne "pop Oops") ; Set quick function "F3" in popup memu
							rFormmID->tOops = tOne
						)
					)
				)
			else
				when(rFormmID->tDone
					axlSetAlias(rFormmID->tDone "done")
					rFormmID->tDone = nil
				)
				when(rFormmID->tCancel
					axlSetAlias(rFormmID->tCancel "cancel")
					rFormmID->tDone = nil
				)
				when(rFormmID->tOops
					axlSetAlias(rFormmID->tOops "oops")
					rFormmID->tDone = nil
				)
			)
		)
	)
)

21. fnTTExit()

procedure(fnTTExit(frmTT)
	let(()
		when(frmTT->commandState == "SELECT_AND_EXECUTE"
			fnTTPopupDone()
		)
		gfnSetAlias(frmTT)
		axlFinishEnterFun() 
		axlUIPopupSet(nil) 
		axlClearDynamics()
		when(axlFormGetField(frmTT "F_chkRestoreView")
			axlVisibleSet(frmTT->lLayerVis)
			axlWindowBoxSet(frmTT->lCurrentArea)
			axlVisibleUpdate(t)
		)
		axlFormClose(frmTT) 
		frmTT->commandState = "IDLE"
		when(frmTT->transMark 
			axlDBTransactionCommit(frmTT->transMark)
		)
	)
)

22. fnTTCalback()

procedure(fnTTCalback(frmTT) 
	let((nMaxValue nMinValue nMinHeight nMaxHeight xMinBlock xMaxBlock)
		;printf("field/value %L = %L (int %L)" frmTT->curField, frmTT->curValue, frmTT->curValueInt)
		;printf("doneState %L\n" frmTT->doneState )
		case(frmTT->curField 
			("F_popLabelName" 
				tLabelName = frmTT->curValue
				axlFormBuildPopup(frmTT "F_popLabelLayer" frmTT->popupInfo[tLabelName]) 
				axlFormSetField(frmTT "F_popLabelLayer" cadar(frmTT->popupInfo[tLabelName]))
				axlVisibleDesign(nil)
				axlVisibleLayer("BOARD GEOMETRY/OUTLINE" t)
				if(tLabelName == "package_geo1" then
					axlFormSetField(frmTT "F_popOutlineLayer" "PIN/")
					axlVisibleLayer("PACKAGE GEOMETRY/PIN_NUMBER" t)
					axlVisibleLayer("PIN/TOP" t)
					axlVisibleLayer("PIN/BOTTOM" t)
					axlSetActiveLayer("PACKAGE GEOMETRY/PIN_NUMBER")
					axlFormSetField(frmTT "F_clrTop" fnTTGetLayerColor("PIN/TOP"))
					axlFormSetField(frmTT "F_clrTop" t)
					axlFormSetField(frmTT "F_clrBottom" fnTTGetLayerColor("PIN/BOTTOM"))
					axlFormSetField(frmTT "F_clrBottom" t)
				else
					when(axlFormGetField(frmTT "F_popOutlineLayer") == "PIN/"
						axlFormSetField(frmTT "F_popOutlineLayer" "PACKAGE GEOMETRY/ASSEMBLY_")
					)
					tLayerName = tLayer = strcat(axlFormGetField(frmTT "F_popLabelLayer") "TOP")
					axlVisibleLayer(tLayer t)
					axlFormSetField(frmTT "F_clrTop" fnTTGetLayerColor(tLayerName))
					axlFormSetField(frmTT "F_clrTop" t)
					
					tLayerName = tLayer = strcat(axlFormGetField(frmTT "F_popLabelLayer") "BOTTOM")
					axlVisibleLayer(tLayer t)
					axlFormSetField(frmTT "F_clrBottom" fnTTGetLayerColor(tLayerName))
					axlFormSetField(frmTT "F_clrBottom" t)
					
					tLayer = strcat(axlFormGetField(frmTT "F_popOutlineLayer") "TOP")
					axlVisibleLayer(tLayer t)
					tLayer = strcat(axlFormGetField(frmTT "F_popOutlineLayer") "BOTTOM")
					axlVisibleLayer(tLayer t)
					
				)
				axlVisibleUpdate(t)
				tLabelName = 'unbound
				tLayer = 'unbound
			)
			("F_popLabelLayer"
				axlVisibleDesign(nil)
				axlVisibleLayer("BOARD GEOMETRY/OUTLINE" t)
				tLayerName = tLayer = strcat(axlFormGetField(frmTT "F_popLabelLayer") "TOP")
				axlVisibleLayer(tLayer t)
				axlFormSetField(frmTT "F_clrTop" fnTTGetLayerColor(tLayerName))
				axlFormSetField(frmTT "F_clrTop" t)
					
				tLayerName = tLayer = strcat(axlFormGetField(frmTT "F_popLabelLayer") "BOTTOM")
				axlVisibleLayer(tLayer t)
				axlFormSetField(frmTT "F_clrBottom" fnTTGetLayerColor(tLayerName))
				axlFormSetField(frmTT "F_clrBottom" t)
					
				tLayer = strcat(axlFormGetField(frmTT "F_popOutlineLayer") "TOP")
				axlVisibleLayer(tLayer t)
				tLayer = strcat(axlFormGetField(frmTT "F_popOutlineLayer") "BOTTOM")
				axlVisibleLayer(tLayer t)
				axlVisibleUpdate(t)
				tLayerName = 'unbound
				tLayer = 'unbound
			)
			("F_popOutlineLayer"
				tOutlineLayer = frmTT->curValue
				axlVisibleDesign(nil)
				axlVisibleLayer("BOARD GEOMETRY/OUTLINE" t)
				tLayer = strcat(axlFormGetField(frmTT "F_popLabelLayer") "TOP")
				axlVisibleLayer(tLayer t)
				tLayer = strcat(axlFormGetField(frmTT "F_popLabelLayer") "BOTTOM")
				axlVisibleLayer(tLayer t)
				cond(
					((axlFormGetField(frmTT "F_popLabelName") == "package_geo1") && (tOutlineLayer == "PIN/")
						axlFormSetField(frmTT "F_popOutlineLayer" "PIN/")
						axlVisibleLayer("PACKAGE GEOMETRY/PIN_NUMBER" t)
						axlVisibleLayer("PIN/TOP" t)
						axlVisibleLayer("PIN/BOTTOM" t)
					)
					((axlFormGetField(frmTT "F_popLabelName") == "package_geo1") && (tOutlineLayer != "PIN/")
						printf("W-The PIN_NUMBER only support pin layer!\n")
						axlFormSetField(frmTT "F_popOutlineLayer" "PIN/")
						axlVisibleLayer("PACKAGE GEOMETRY/PIN_NUMBER" t)
						axlVisibleLayer("PIN/TOP" t)
						axlVisibleLayer("PIN/BOTTOM" t)
					)
					((axlFormGetField(frmTT "F_popLabelName") != "package_geo1") && (tOutlineLayer == "PIN/")
						printf("W-The pin only support PIN_NUMBER layer!\n")
						axlFormSetField(frmTT "F_popOutlineLayer" "PACKAGE GEOMETRY/ASSEMBLY_")
						tOutlineLayer = "PACKAGE GEOMETRY/ASSEMBLY_"
						tLayer = strcat(tOutlineLayer "TOP")
						axlVisibleLayer(tLayer t)
						tLayer = strcat(tOutlineLayer "BOTTOM")
						axlVisibleLayer(tLayer t)
					)
					((axlFormGetField(frmTT "F_popLabelName") != "package_geo1") && (tOutlineLayer != "PIN/")
						tLayer = strcat(tOutlineLayer "TOP")
						axlVisibleLayer(tLayer t)
						tLayer = strcat(tOutlineLayer "BOTTOM")
						axlVisibleLayer(tLayer t)
					)
				)
				axlVisibleUpdate(t)
				tOutlineLayer = 'unbound
				tLayer = 'unbound
			)
			("F_clrTop"
				tLabelName = axlFormGetField(frmTT "F_popLabelName")
				if(tLabelName == "package_geo1" then
					tLayerName = "PIN/TOP"
					tLayerOutline = "PIN/TOP"
				else
					tLayerName = strcat(axlFormGetField(frmTT "F_popLabelLayer") "TOP")
					tLayerOutline = strcat(axlFormGetField(frmTT "F_popOutlineLayer") "TOP")
				)
				if(axlIsVisibleLayer(tLayerName) then
					axlVisibleLayer(tLayerName nil)
					axlVisibleLayer(tLayerOutline nil)
					axlFormSetField(frmTT "F_clrTop" 0)
					axlFormSetField(frmTT "F_clrTop" nil)
				else
					axlSetActiveLayer(tLayerName)
					axlVisibleLayer(tLayerName t)
					axlVisibleLayer(tLayerOutline t)
					axlFormSetField(frmTT "F_clrTop" fnTTGetLayerColor(tLayerName))
					axlFormSetField(frmTT "F_clrTop" t)
				)
				axlVisibleUpdate(t)
				tLabelName = 'unbound
				tLayerName = 'unbound
				tLayerOutline = 'unbound
			)
			("F_clrBottom"
				tLabelName = axlFormGetField(frmTT "F_popLabelName")
				if(tLabelName == "package_geo1" then
					tLayerName = "PIN/BOTTOM"
					tLayerOutline = "PIN/BOTTOM"
				else
					tLayerName = strcat(axlFormGetField(frmTT "F_popLabelLayer") "BOTTOM")
					tLayerOutline = strcat(axlFormGetField(frmTT "F_popOutlineLayer") "BOTTOM")
				)
				if(axlIsVisibleLayer(tLayerName) then
					axlVisibleLayer(tLayerName nil)
					axlVisibleLayer(tLayerOutline nil)
					axlFormSetField(frmTT "F_clrBottom" 0)
					axlFormSetField(frmTT "F_clrBottom" nil)
				else
					axlSetActiveLayer(tLayerName)
					axlVisibleLayer(tLayerName t)
					axlVisibleLayer(tLayerOutline t)
					axlFormSetField(frmTT "F_clrBottom" fnTTGetLayerColor(tLayerName))
					axlFormSetField(frmTT "F_clrBottom" t)
				)
				axlVisibleUpdate(t)
				tLabelName = 'unbound
				tLayerName = 'unbound
				tLayerOutline = 'unbound
			)
			("F_chkMirrorBottomOnly"
				if(frmTT->curValue then
					axlFormSetField(frmTT "F_popBottomLongSideX" 0.0)
					axlFormSetField(frmTT "F_popBottomLongSideY" 270.0)
				else
					axlFormSetField(frmTT "F_popBottomLongSideX" 0.0)
					axlFormSetField(frmTT "F_popBottomLongSideY" 90.0)
				)
			)
			;("F_rdoNoMirror"
			;	axlFormSetField(frmTT "F_popBottomLongSideX" 0.0)
			;	axlFormSetField(frmTT "F_popBottomLongSideY" 90.0)
			;)
			("F_ckbRotateText" 
				unless(axlFormGetField(frmTT "F_ckbRotateText") 
					axlFormSetField(frmTT "F_ckbFitText" nil)
				)
				fnTTUpdateFormField(frmTT)
			)
			("F_ckbModifyTextBlk" 
				if(axlFormGetField(frmTT "F_ckbModifyTextBlk") then
					axlFormSetField(frmTT "F_rdoTextFitByBlock" t)
					;axlFormSetFieldEditable(frmTT "F_iptMinTextHeight" nil) 
					;axlFormSetFieldEditable(frmTT "F_iptMaxTextHeight" nil) 
					;axlFormSetFieldEditable(frmTT "F_barMinTextBlock" t)
					;axlFormSetFieldEditable(frmTT "F_barMaxTextBlock" nil)
					xMinBlock = axlFormGetField(frmTT "F_barMinTextBlock")
					xMaxBlock = axlFormGetField(frmTT "F_barMaxTextBlock")
					frmTT->blockInfo = fnTTGetBlockInfo(xMinBlock xMaxBlock "block_mode")
				else
					axlFormSetField(frmTT "F_ckbFitText" nil)
				)
				fnTTUpdateFormField(frmTT)
			)
			("F_ckbCenterText" 
				if(frmTT->curValue then 
					axlFormSetFieldEditable(frmTT "F_iptDx" t) 
					axlFormSetFieldEditable(frmTT "F_iptDy" t)
				else
					axlFormSetField(frmTT "F_ckbFitText" nil) 
					axlFormSetFieldEditable(frmTT "F_iptDx" nil) 
					axlFormSetFieldEditable(frmTT "F_iptDy" nil)
				)
				fnTTUpdateFormField(frmTT)
			) 
			("F_ckbFitText" 
				if(axlFormGetField(frmTT "F_ckbFitText") then 
					axlFormSetField(frmTT "F_ckbRotateText" t)
					axlFormSetField(frmTT "F_ckbModifyTextBlk" t)
					axlFormSetField(frmTT "F_ckbCenterText" t) 
					axlFormSetFieldEditable(frmTT "F_iptDx" t)
					axlFormSetFieldEditable(frmTT "F_iptDy" t)
					
					axlFormSetField(frmTT "F_rdoTextFitByHeight" t)
					;axlFormSetFieldEditable(frmTT "F_iptMinTextHeight" t) 
					;axlFormSetFieldEditable(frmTT "F_iptMaxTextHeight" t) 
					;axlFormSetFieldEditable(frmTT "F_barMinTextBlock" nil)
					;axlFormSetFieldEditable(frmTT "F_barMaxTextBlock" nil)
					nMinHeight = axlFormGetField(frmTT "F_iptMinTextHeight")
					nMaxHeight = axlFormGetField(frmTT "F_iptMaxTextHeight")
					frmTT->blockInfo = fnTTGetBlockInfo(nMinHeight nMaxHeight "height_mode")
				else
					when(axlFormGetField(frmTT "F_ckbModifyTextBlk")
						axlFormSetField(frmTT "F_rdoTextFitByBlock" t)
						;axlFormSetFieldEditable(frmTT "F_iptMinTextHeight" nil) 
						;axlFormSetFieldEditable(frmTT "F_iptMaxTextHeight" nil) 
						;axlFormSetFieldEditable(frmTT "F_barMinTextBlock" t)
						;axlFormSetFieldEditable(frmTT "F_barMaxTextBlock" nil)
						xMinBlock = axlFormGetField(frmTT "F_barMinTextBlock")
						xMaxBlock = axlFormGetField(frmTT "F_barMaxTextBlock")
						frmTT->blockInfo = fnTTGetBlockInfo(xMinBlock xMaxBlock "block_mode")
					)
				)
				fnTTUpdateFormField(frmTT)
			) 
			("F_rdoTextRotationLongSide" 
				axlFormSetFieldEditable(frmTT "F_popTopLongSideX" t) 
				axlFormSetFieldEditable(frmTT "F_popTopLongSideY" t) 
				axlFormSetFieldEditable(frmTT "F_popBottomLongSideX" t) 
				axlFormSetFieldEditable(frmTT "F_popBottomLongSideY" t)
				axlFormSetFieldEditable(frmTT "F_popForceAngle" nil)
			)
			("F_rdoTextRotationForceAngle" 
				axlFormSetFieldEditable(frmTT "F_popTopLongSideX" nil) 
				axlFormSetFieldEditable(frmTT "F_popTopLongSideY" nil) 
				axlFormSetFieldEditable(frmTT "F_popBottomLongSideX" nil) 
				axlFormSetFieldEditable(frmTT "F_popBottomLongSideY" nil)
				axlFormSetFieldEditable(frmTT "F_popForceAngle" t)
			) 
			("F_rdoTextRotationLabelAngle" 
				axlFormSetFieldEditable(frmTT "F_popTopLongSideX" nil) 
				axlFormSetFieldEditable(frmTT "F_popTopLongSideY" nil) 
				axlFormSetFieldEditable(frmTT "F_popBottomLongSideX" nil) 
				axlFormSetFieldEditable(frmTT "F_popBottomLongSideY" nil)
				axlFormSetFieldEditable(frmTT "F_popForceAngle" nil)
			)
			("F_rdoTextFitByHeight"
				if(frmTT->curValue then 
					axlFormSetFieldEditable(frmTT "F_iptMinTextHeight" t) 
					axlFormSetFieldEditable(frmTT "F_iptMaxTextHeight" t) 
					axlFormSetFieldEditable(frmTT "F_barMinTextBlock" nil)
					axlFormSetFieldEditable(frmTT "F_barMaxTextBlock" nil)
				else
					axlFormSetFieldEditable(frmTT "F_iptMinTextHeight" nil) 
					axlFormSetFieldEditable(frmTT "F_iptMaxTextHeight" nil) 
					axlFormSetFieldEditable(frmTT "F_barMinTextBlock" t)
					axlFormSetFieldEditable(frmTT "F_barMaxTextBlock" t)
				) 
				nMinHeight = axlFormGetField(frmTT "F_iptMinTextHeight")
				nMaxHeight = axlFormGetField(frmTT "F_iptMaxTextHeight")
				frmTT->blockInfo = fnTTGetBlockInfo(nMinHeight nMaxHeight "height_mode")
			)
			("F_iptMinTextHeight" 
				when(frmTT->curValue > axlFormGetField(frmTT "F_iptMaxTextHeight")
					axlUIWPrint(frmTT "Error: Min height must not be greater than max height!") 
					nMaxValue = axlFormGetField(frmTT "F_iptMaxTextHeight")
					axlFormSetField(frmTT "F_iptMinTextHeight" nMaxValue)
				) 
				nMinHeight = axlFormGetField(frmTT "F_iptMinTextHeight")
				nMaxHeight = axlFormGetField(frmTT "F_iptMaxTextHeight")
				frmTT->blockInfo = fnTTGetBlockInfo(nMinHeight nMaxHeight "height_mode")
			)
			("F_iptMaxTextHeight" 
				when(frmTT->curValue < axlFormGetField(frmTT "F_iptMinTextHeight")
					axlUIWPrint(frmTT "Error: Max height  must not be smaller than min height!") 
					nMinValue = axlFormGetField(frmTT "F_iptMinTextHeight")
					axlFormSetField(frmTT "F_iptMaxTextHeight" nMinValue)
				) 
				nMinHeight = axlFormGetField(frmTT "F_iptMinTextHeight") 
				nMaxHeight = axlFormGetField(frmTT "F_iptMaxTextHeight") 
				frmTT->blockInfo = fnTTGetBlockInfo(nMinHeight nMaxHeight "height_mode")
			) 
			("F_rdoTextFitByBlock" 
				if(frmTT->curValue then 
					axlFormSetFieldEditable(frmTT "F_iptMinTextHeight" nil) 
					axlFormSetFieldEditable(frmTT "F_iptMaxTextHeight" nil) 
					axlFormSetFieldEditable(frmTT "F_barMinTextBlock" t)
					axlFormSetFieldEditable(frmTT "F_barMaxTextBlock" t)
				else
					axlFormSetFieldEditable(frmTT "F_iptMinTextHeight" t) 
					axlFormSetFieldEditable(frmTT "F_iptMaxTextHeight" t) 
					axlFormSetFieldEditable(frmTT "F_barMinTextBlock" nil)
					axlFormSetFieldEditable(frmTT "F_barMaxTextBlock" nil)
				) 
				xMinBlock = axlFormGetField(frmTT "F_barMinTextBlock")
				xMaxBlock = axlFormGetField(frmTT "F_barMaxTextBlock")
				frmTT->blockInfo = fnTTGetBlockInfo(xMinBlock xMaxBlock "block_mode")
			) 
			("F_barMinTextBlock" 
				when(axlFormGetField(frmTT "F_barMinTextBlock") > axlFormGetField(frmTT "F_barMaxTextBlock")
					axlUIWPrint(frmTT "Error: Min block must not be greater than max block!") 
					nMaxValue = axlFormGetField(frmTT "F_barMaxTextBlock")
					axlFormSetField(frmTT "F_barMinTextBlock" nMaxValue)
				) 
				xMinBlock = axlFormGetField(frmTT "F_barMinTextBlock")
				xMaxBlock = axlFormGetField(frmTT "F_barMaxTextBlock")
				frmTT->blockInfo = fnTTGetBlockInfo(xMinBlock xMaxBlock "block_mode")
			) 
			("F_barMaxTextBlock" 
				when(axlFormGetField(frmTT "F_barMaxTextBlock") > length(frmTT->textList) 
					printf("W-The maximum text block value is %d\n" length(frmTT->textList)) 
					axlFormSetField(frmTT "F_barMaxTextBlock" length(frmTT->textList))
				) 
				when(axlFormGetField(frmTT "F_barMaxTextBlock") < axlFormGetField(frmTT "F_barMinTextBlock") 
					axlUIWPrint(frmTT "Error: Max block  must not be smaller than min block!") 
					nMinValue = axlFormGetField(frmTT "F_barMinTextBlock") 
					axlFormSetField(frmTT "F_barMaxTextBlock" nMinValue)
				) 
				xMinBlock = axlFormGetField(frmTT "F_barMinTextBlock") 
				xMaxBlock = axlFormGetField(frmTT "F_barMaxTextBlock")
				frmTT->blockInfo = fnTTGetBlockInfo(xMinBlock xMaxBlock "block_mode")
			)
			("F_barTextBlk"
				fnTTUpdateTextBlkValue(frmTT t)
			)
			("F_iptWidth"
				fnTTUpdateTextBlkValue(frmTT nil)
			)
			("F_iptHeight"
				fnTTUpdateTextBlkValue(frmTT nil)
			)
			("F_iptLineSpace"
				fnTTUpdateTextBlkValue(frmTT nil)
			)
			("F_iptPhotoWidth"
				fnTTUpdateTextBlkValue(frmTT nil)
			)
			("F_iptCharSpace"
				fnTTUpdateTextBlkValue(frmTT nil)
			)
			("F_btnExecute" 
				if(axlOKToProceed() then 
					if(frmTT->commandState == "IDLE" then 
						axlFormSetFieldEditable(frmTT "F_btnExecute" nil)
						axlCancelEnterFun() 
						axlUIPopupSet(nil) 
						axlClearDynamics()
						axlUIWPrint(frmTT "Please select components...")
						frmTT->commandState = "SELECT_AND_EXECUTE"
						printf("M-Please select components...\n")
						axlShell("tt run")
						;fnTTStart()
						axlFormSetFieldEditable(frmTT "F_btnExecute" t)
						axlUIWPrint(frmTT "Execute finish.")
					)
				else 
					axlUIWPrint(frmTT "E - Finish current command first!")
				)
			)
			("F_btnExit"
				fnTTExit(frmTT)
			) 
		)
		when(frmTT->doneState == 3
			fnTTExit(frmTT)
		)
	)
)

 

文章標籤
全站熱搜
創作者介紹
創作者 熊熊 的頭像
熊熊

熊熊的部落格

熊熊 發表在 痞客邦 留言(1) 人氣(954)