请教下,下面这段代码都做了些什么. 先谢谢了!!!!! (setq or_func:dlg_use_index 0)
;if click ok exit dialog this will be set true and really exit dialog (setq or_func:dlg_use_exit_flag nil) (setq or_func:dlg_use_max_items_per_page 10) (setq or_func:dlg_use_refined_data nil) (setq or_func:dlg_use_display_data_len 0) ;not display these algorithm parameter (setq or_func:param_list_need_not_display (list "MATCHED" "IMAGE_INDEX" "CHANGED" "X_SYM_OFF " "X_SYM_OFF" "Y_SYM_OFF " "Y_SYM_OFF" "SEQUENCE" "FUNC_NAME" "TUNABLE" "DIAG" "ALG_TYP" "ALG_NAME" ) )
;---------------------------------------------- ;main funciton open the dialog ;---------------------------------------------- (defun or_func:main (/ block rawdata blk_type finedata cmdecho) ;set system var disable cmd echo (setq cmdecho (getvar "cmdecho")) (setvar "cmdecho" 0)
(setq block (or_func:select_block)) (if block (progn (setq rawdata (or_func:get_block_rawdata block)) (setq blk_type (or_func:check_block_type rawdata)) (setq finedata (or_func:format_rawdata rawdata)) ;display on textscr (or_func:display_on_textscr finedata blk_type) ;----------------------------------------------------------------------- ;set global var for dialog use (setq or_func:dlg_use_refined_data finedata) (while (not or_func:dlg_use_exit_flag) (or_func:display_on_dialog or_func:dlg_use_refined_data blk_type ) ) (setq or_func:dlg_use_refined_data nil) (setq or_func:dlg_use_index 0) (setq or_func:dlg_use_exit_flag nil) (setq or_func:dlg_use_display_data_len 0) ;----------------------------------------------------------------------- ) (prompt "No block selected...\n") )
(setvar "cmdecho" cmdecho) (princ) )
;---------------------------------------------- ;dialog output parameters with block type ;----------------------------------------------
(defun or_func:display_on_dialog (refined_data blk_type) (cond ((= blk_type "ALG") (or_func:display_dlg_alg_blk refined_data) ) ((= blk_type "SIG") ;not display sig info with dialog see it on textscr (setq or_func:dlg_use_exit_flag t) ) (t ;nothing happened (setq or_func:dlg_use_exit_flag t) ) ) )
;---------------------------------------------- ;dialog output alg-blk parameters (need refactoring) ;----------------------------------------------
(defun or_func:display_dlg_alg_blk (refined_data / remove_list rmv_lst_len index display_data func_name alg_name temp dcl_content fname fn display_data_len dcl_id dlg_make_index dlg_make_count ) ;------------------------------------------------------- ; 1 remove no use parameter frome refined_data make display_data ; 2 get useful data like func_name,alg_name from refined_data ; 3 dynamic create dialog resource dcl.dcl and component resource ; 4 load dialog and update control data ; 5 set dialog action action_tile ; 6 unload dialog delete resource dcl ;-------------------------------------------------------
;init
;remove no use parameter (setq remove_list or_func:param_list_need_not_display) (setq index 0) (setq rmv_lst_len (length remove_list)) (setq display_data refined_data) (while (< index rmv_lst_len) (setq display_data (vl-remove (assoc (nth index remove_list) display_data) display_data ) ) (setq index (+ index 1)) )
;get function name (setq func_name (cdr (assoc "FUNC_NAME" refined_data))) (setq alg_name (cdr (assoc "ALG_NAME" refined_data))) (setq display_data_len (length display_data)) (setq or_func:dlg_use_display_data_len display_data_len)
;create dialog resource ;create dcl file and open (setq fname (vl-filename-mktemp "ocdapr.dcl")) (setq fn (open fname "w"))
;create header (setq dcl_content "ocdapr : dialog { label = \"Ovation Controlbuilder Drawing Algorithm Parameter Reader\" ; spacer; alg_block_name;\n" ) (write-line dcl_content fn)
;------------------------------------------------------- ;create attribute list (setq dcl_content ": boxed_column {//\n") ;boxed_column start (setq dcl_content (strcat dcl_content ": row {")) ;row start ;-------------------------------------------------------
;begin index column (setq dcl_content (strcat dcl_content ":column{\nindex_label;\n") ) ;label (setq dlg_make_index or_func:dlg_use_index) (setq dlg_make_count 0) (while (and (< dlg_make_count or_func:dlg_use_max_items_per_page) (< dlg_make_index display_data_len) )
(setq dcl_content (strcat dcl_content ": index { label=\"")) (setq dcl_content (strcat dcl_content (or_func:format_2digi dlg_make_index) ) ) (setq dcl_content (strcat dcl_content "\";}//\n"))
(setq dlg_make_count (+ dlg_make_count 1)) (setq dlg_make_index (+ dlg_make_index 1)) ) (setq dcl_content (strcat dcl_content "}//\n")) ;end index colunm
;begin parameter name colum (setq dcl_content (strcat dcl_content ":column{\nparameter_label;\n") ) ;label (setq dlg_make_index or_func:dlg_use_index) (setq dlg_make_count 0) (while (and (< dlg_make_count or_func:dlg_use_max_items_per_page) (< dlg_make_index display_data_len) )
(setq dcl_content (strcat dcl_content ": para_name { label=\"")) (setq dcl_content (strcat dcl_content (car (nth dlg_make_index display_data)) ) ) (setq dcl_content (strcat dcl_content "\";}//\n"))
(setq dlg_make_count (+ dlg_make_count 1)) (setq dlg_make_index (+ dlg_make_index 1)) ) (setq dcl_content (strcat dcl_content "}//\n")) ;end parameter colunm
;begin value column (setq dcl_content (strcat dcl_content ":column{\nvalue_label;\n") ) ;label (setq dlg_make_index or_func:dlg_use_index) (setq dlg_make_count 0) (while (and (< dlg_make_count or_func:dlg_use_max_items_per_page) (< dlg_make_index display_data_len) )
(setq dcl_content (strcat dcl_content ": para_value { value=\"")) (setq dcl_content (strcat dcl_content (cdr (nth dlg_make_index display_data)) ) ) (setq dcl_content (strcat dcl_content "\";}//\n"))
(setq dlg_make_count (+ dlg_make_count 1)) (setq dlg_make_index (+ dlg_make_index 1)) ) (setq dcl_content (strcat dcl_content "}//\n")) ;end value column
;begin description column (setq dcl_content (strcat dcl_content ":column{\ndescription_label;\n") ) ;label (setq dlg_make_index or_func:dlg_use_index) (setq dlg_make_count 0) (while (and (< dlg_make_count or_func:dlg_use_max_items_per_page) (< dlg_make_index display_data_len) )
(setq dcl_content (strcat dcl_content ": description { label=\""))
(setq dcl_content (strcat dcl_content (or_func:find_description func_name (car (nth dlg_make_index display_data)) ) ;search description ) ) ; (setq dcl_content (strcat dcl_content "\";}//\n")) ;
(setq dlg_make_count (+ dlg_make_count 1)) (setq dlg_make_index (+ dlg_make_index 1)) ) (setq dcl_content (strcat dcl_content "}//\n")) ;end description column
;------------------------------------------------------- (setq dcl_content (strcat dcl_content "}//end row\n")) ;end row (setq dcl_content (strcat dcl_content "spacer;\n")) ;add spacer (setq dcl_content (strcat dcl_content "}//end boxed_column\n")) ;end box (write-line dcl_content fn) ;create attribute list over ;-------------------------------------------------------
;create turnpage button and close button (if (> display_data_len or_func:dlg_use_max_items_per_page) (progn (setq dcl_content "turnpagebutton;//\n") (write-line dcl_content fn) ) ) (setq dcl_content "cancelbutton;\n}//") (write-line dcl_content fn)
;create dcl tail contents (setq dcl_content (or_func:get_dcl_resource_components)) (write-line dcl_content fn)
;create over, close temp dcl file (close fn)
;load dialog (setq dcl_id (load_dialog fname)) (if (not (new_dialog "ocdapr" dcl_id)) (exit) ) ;if
;updata dialog data !!! (set_tile "func_name" func_name) (set_tile "alg_name" alg_name)
;set dialog button action (action_tile "prev" "(or_func:btn_prev_action)") (action_tile "next" "(or_func:btn_next_action)") (action_tile "cancel" "(or_func:btn_cancel_action)")
;show dialog (start_dialog)
;unload dialog resource and delete temp dcl file (unload_dialog dcl_id) (vl-file-delete fname) (princ) ;end
) ;---------------------------------------------- ;----------------------------------------------
;---------------------------------------------- ;dialog button action
;dialog button action "cancel" (defun or_func:btn_cancel_action () (setq or_func:dlg_use_exit_flag T) (setq or_func:dlg_use_index 0) (done_dialog 0) )
;dialog button action "prev" (defun or_func:btn_prev_action () ;change index to new value and set exit flag nil to open dialog again (setq or_func:dlg_use_exit_flag nil) (setq or_func:dlg_use_index (- or_func:dlg_use_index or_func:dlg_use_max_items_per_page ) ) (if (< or_func:dlg_use_index 0) (setq or_func:dlg_use_index (* (/ or_func:dlg_use_display_data_len or_func:dlg_use_max_items_per_page ) or_func:dlg_use_max_items_per_page ) ) ) (done_dialog 0) )
;dialog button action "next" (defun or_func:btn_next_action () ;change index to new value and set exit flag nil to open dialog again (setq or_func:dlg_use_exit_flag nil) (setq or_func:dlg_use_index (+ or_func:dlg_use_index or_func:dlg_use_max_items_per_page ) ) (if (> or_func:dlg_use_index or_func:dlg_use_display_data_len) (setq or_func:dlg_use_index 0) ) (done_dialog 0) ) ;----------------------------------------------
;format 2 digi string 9 => "09" (defun or_func:format_2digi (digi / str) (if (< digi 10) (setq str (strcat "0" (rtos digi 5))) (setq str (rtos digi 5)) ) str ;return )
;shoutcut function for dyn_create dlc resource ;get dcl resource components (defun or_func:get_dcl_resource_components (/ dcl_content) (setq dcl_content "alg_block_name : column { : row { : text { label = \"Function name:\" ; key = \"func_name_label\" ; } : text { label = \"[funtion name here]\" ; key = \"func_name\" ; alignment = right ; } spacer ; : text { label = \"Algorithm name:\" ; key = \"alg_name_label\" ; } : text { label = \"[funtion name here]\" ; key = \"alg_name\" ; alignment = right ; } } } turnpagebutton : column { : boxed_column { : row { : button { label = \"<< Previous Page\"; key = \"prev\"; mnemonic = \"P\"; alignment = centered; width = 25; fixed_width = true; } spacer; : button { label = \"Next Page >>\"; key = \"next\"; mnemonic = \"N\"; alignment = centered; width = 25; fixed_width = true; } } spacer; } } cancelbutton : retirement_button { label = \"close ocdapr\"; key = \"cancel\"; is_cancel = true; } index_label : text { label = \"[No.]\" ; fixed_width = true ; width = 4 ; alignment = centered ; } parameter_label : text { label = \"[Parameter]\" ; alignment = centered ; } value_label : text { label = \"[Value]\" ; alignment = centered ; } description_label : text { label = \"[Description]\" ; } index : text { label = \"00\" ; fixed_width = true ; width = 4 ; alignment = centered ; } para_name : text { label = \"parameter00\" ; fixed_width = true ; width = 10 ; alignment = centered ; } para_value : edit_box { value = \"value 00\" ; fixed_width = true ; width = 15 ; alignment = centered ; } description : text { label = \"some description ...\" ; fixed_width = true ; width = 30 ; } " ) dcl_content ;return )
;---------------------------------------------- ;text output parameters with block type ;----------------------------------------------
(defun or_func:display_on_textscr (refined_data blk_type) (cond ((= blk_type "ALG") (or_func:display_text_alg_blk refined_data) ) ((= blk_type "SIG") (or_func:display_text_sig_blk refined_data) ) (t (print "Unknow block...")) ) )
;text output sig-blk parameters (defun or_func:display_text_sig_blk (refined_data) (print "These are parameters of sig_blk:") (print refined_data) )
;text output alg-blk parameters (defun or_func:display_text_alg_blk (refined_data / remove_list rmv_lst_len index display_data func_name alg_name )
;remove no useparameter (setq remove_list or_func:param_list_need_not_display) (setq index 0) (setq rmv_lst_len (length remove_list)) (setq display_data refined_data) (while (< index rmv_lst_len) (setq display_data (vl-remove (assoc (nth index remove_list) display_data) display_data ) ) (setq index (+ index 1)) )
;get block function name alg name from refined data and display (setq func_name (cdr (assoc "FUNC_NAME" refined_data))) (setq alg_name (cdr (assoc "ALG_NAME" refined_data)))
(print (strcat "These are " func_name " parameters of alg_blk:" alg_name ) ) ;display (print display_data) )
;---------------------------------------------- ;find description of parameter use description table ;----------------------------------------------
(defun or_func:find_description (func_name param_name / fun para description)
(setq fun (vl-string-trim " " func_name)) (setq para (vl-string-trim " " param_name)) (setq description nil) (setq description (cdr (assoc para (cdr (assoc fun or_res:ocdapr_param_description_table)) ) ) ) (if (null description) (setq description "") ) description ;return )
;---------------------------------------------- ;format rawdata make refined data ;----------------------------------------------
;format raw data change (1000 . "x=y") to (x . y) (defun or_func:format_rawdata (rawdata / index data_len temp refined_data) (setq refined_data nil) (setq index 0) (setq data_len (length rawdata))
(while (< index data_len) (setq temp (cdr (nth index rawdata))) (setq refined_data (append refined_data (list (or_func:split_string temp "=")) ) ) (setq index (+ index 1)) )
refined_data ;return )
;split string to key pair "x=y" => (x . y) (defun or_func:split_string (str seperator / index str1 str2 keypair) ;find seperator (setq index (vl-string-search seperator str)) ;extract 2 strings (setq str1 (substr str 1 index)) (setq str2 (substr str (+ index 2))) (cons str1 str2) ;return )
;---------------------------------------------- ;get block eed raw data with applist "control_builder_west_pcd" ;----------------------------------------------
(defun or_func:get_block_rawdata (block / rawdata) (setq rawdata (cdadr (assoc -3 (entget block '("control_builder_west_pcd")) ) ) ) rawdata ;return )
;---------------------------------------------- ;check block type use raw data ;----------------------------------------------
(defun or_func:check_block_type (rawdata / temp data_len index blk_type) ;SIGNAL_NAME,ALG_NAME (setq data_len (length rawdata)) (setq blk_type nil) (setq index 0) (while (and (< index data_len) (null blk_type)) (setq temp (nth index rawdata)) (cond ((or_func:find_key temp "SIGNAL_NAME") (setq blk_type "SIG") ) ((or_func:find_key temp "ALG_NAME") (setq blk_type "ALG")) ) (setq index (+ index 1)) ) blk_type ;return )
;check if key in assoc data (defun or_func:find_key (data key / temp is_key_found)
(setq temp (cdr data)) (setq is_key_found (wcmatch temp (strcat key "=*"))) is_key_found ;return )
;---------------------------------------------- ;select block ;---------------------------------------------- ;select block if pickfirst set 1 (defun or_func:ssget_imp (/ ss) (if (eq 1 (logand 1 (getvar "pickfirst"))) (setq ss (ssget "I")) ) ss ;return )
;select block (defun or_func:select_block (/ ss block ss_len) (setq ss (or_func:ssget_imp)) (setq block nil)
(if (not ss) (progn (prompt "\nSelect algorithm body:") (command "_.select" "_single" pause) ;get the last set selected (setq ss (ssget "P")) ) )
(setq ss_len (sslength ss)) ;get the first block in set (if (> ss_len 0) (setq block (ssname ss 0)) )
(setq ss nil) ;clear sset block ;return )
;---------------------------------------------- ;display about dialog ;---------------------------------------------- (defun or_func:about (/ dcl_id) (setq dcl_id (load_dialog "or_res.dcl")) (if (not (new_dialog "hello" dcl_id)) (exit) ) (start_dialog) (unload_dialog dcl_id) (princ) )
|