- 积分
- 15341
- 明经币
- 个
- 注册时间
- 2002-2-4
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2002-6-12 17:12:00
|
显示全部楼层
试试这个!!!我未用过小心又死机!!!
/* ARC_TEXT.DCL */
/* */
/* 弧状排列文字 */
arct_1: dialog { // 对话框名称= arct_1
label = "弧状排列文字"; // 对话框标题
spacer; // 加入一列空白框栏, 美化画面
: row {
: image { // 加入<影像>组件
key = "key_image"; // 键值为key_image
height = 4; // 定义<影像>组件的高度
width = 20; // 定义<影像>组件的宽度
} // end of image // 结束<影像>组件定义
: radio_column{ // 加入<选台钮列>组件
: radio_button { // 加入<选台钮>组件
label = "字在弧外, 顺时针 (O)"; // 选台钮的提示文句
key = "key_type_a"; // 键值为key_type_a
value = 0; // 默认值= 0
width = 24; // 指定<选台钮>的宽度
mnemonic = "O"; // 快速键= "O"
} // end of radio_button 1 // 结束<选台钮>组件定义
: radio_button { // 加入<选台钮>组件
label = "字在弧内 , 顺时针 (I)"; // 选台钮的提示文句
key = "key_type_b"; // 键值为key_type_b
value = 0; // 默认值= 0
width = 24; // 指定<选台钮>的宽度
mnemonic = "I"; // 快速键= "I"
} // end of radio_button 2 // 结束<选台钮>组件定义
: radio_button { // 加入<选台钮>组件
label = "字在弧外, 逆时针 (M)"; // 选台钮的提示文句
key = "key_type_c"; // 键值为key_type_c
value = 0; // 默认值= 0
width = 24; // 指定<选台钮>的宽度
mnemonic = "M"; // 快速键= "M"
} // end of radio_button 3 // 结束<选台钮>组件定义
: radio_button { // 加入<选台钮>组件
label = "字在弧内, 逆时针 (N)"; // 选台钮的提示文句
key = "key_type_d"; // 键值为key_type_d
value = 0; // 默认值= 0
width = 24; // 指定<选台钮>的宽度
mnemonic = "N"; // 快速键= "N"
} // end of radio_button 4 // 结束<选台钮>组件定义
}// end of radio_column // 结束<选台钮列>组件定义
} // end of row
: boxed_column{ // 加入一个<框行>框栏
: edit_box { // 加入<编辑框>组件
label = "弧状文字的内容 (T)"; // 编辑框的标题文句
key = "dcl_text_str"; // 键值为dcl_text_str
edit_limit = 32; // 指定编辑框可用的最大字符长度
mnemonic = "T"; // 快速键= "T"
} // end of edit_box 1 // 结束<编辑框>组件定义
: edit_box { // 加入<编辑框>组件
label = "文字字高 (H)"; // 编辑框的标题文句
key = "dcl_text_high"; // 键值为dcl_text_high
edit_limit = 20; // 指定编辑框可用的最大字符长度
edit_width = 4; // 指定编辑框的宽度
mnemonic = "H"; // 快速键= "H"
} // end of edit_box 2 // 结束<编辑框>组件定义
: edit_box { // 加入<编辑框>组件
label = "文字与圆弧的间距 (G)"; // 编辑框的标题文句
key = "dcl_base_gap"; // 键值为dcl_base_gap
edit_limit = 20; // 指定编辑框可用的最大字符长度
edit_width = 5; // 指定编辑框的宽度
mnemonic = "G"; // 快速键= "G"
} // end of edit_box 3 // 结束<编辑框>组件定义
: popup_list { // 加入<清单选窗>组件
label = "可选用的字型 (S)"; // 清单选窗的标题文句
key = "dcl_styl_popup"; // 键值为dcl_styl_popup
edit_width = 18; // 指定清单选窗的宽度
mnemonic = "S"; // 快速键= "S"
} // end of popup_list // 结束<清单选窗>组件定义
spacer; // 加入一列空白框栏, 美化画面
} // end of column // 结束<纵行>框栏定义
initial_focus = "dcl_text_str"; // 预设焦点
spacer; // 加入一列空白框栏, 美化画面
ok_cancel_help; // 加入一个<确定钮-取消钮-说明钮>组件
} // end of dialog // 结束arct_1对话框定义
; ARC_TEXT.LSP
;
; 呼叫Arc_text.dcl档案, 将指定的字符串, 依选取的圆弧弧状排列
; Jan. 06. '98
; 快速载入档案的辅助函式
(defun c:lsp()
(load "arc_text")
)
; 错误捕捉函式
(defun *error* ()
(princ "\n < 发生非预期的错误 ! ! >")
)
; 将文字依选取的圆弧弧状排列
; dcl_file DCL档案的名称
; dcl_name 对话框的名称
; dcl_flag DCL档案的档案指标
; key_sel 使用者在对话框里<选台钮>的选项指针
; text_str 使用者指定的字符串内容
; text_high 使用者指定的字高
; base_gap 文字与圆弧的间隙
; text_styl 使用者选用的字型
; ok_id 是否按<确定>钮?
; styl_list <字型对象名称>的串行
;
(defun C:ARC_TEXT (/ dcl_file dcl_name dcl_flag key_sel text_str text_high base_gap text_styl ok_id styl_list ) ; 指定函式名称
(setvar "blipmode" 0) ; 重设系统变量的设定值
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(setq dcl_file "arc_text" ; 指定DCL档案的名称
dcl_name "arct_1") ; 指定对话框的名称
(setq dcl_flag (load_dialog dcl_file)) ; 载入DCL档案
(if (< dcl_flag 0) (exit)) ; 判断DCL档案是否已加载?
(if (not (new_dialog dcl_name dcl_flag)) (exit)) ; 显现对话框画面
(dcl_tile_init) ; 设定对话框中各<键>的初始值
(find_styl) ; 将<字型名称串行>填入下拉式<清单选窗>
(setq key_sel 1) ; 默认值
(action_tile "key_type_a" "(dcl_image \"key_image\" \"r14_lisp(a_text1)\")(setq key_sel 1)") ; 如果选取<字在弧外, 顺时针>
(action_tile "key_type_b" "(dcl_image \"key_image\" \"r14_lisp(a_text2)\")(setq key_sel 2)") ; 如果选取<字在弧内, 顺时针>
(action_tile "key_type_c" "(dcl_image \"key_image\" \"r14_lisp(a_text3)\")(setq key_sel 3)"); 如果选取<字在弧外, 逆时针>
(action_tile "key_type_d" "(dcl_image \"key_image\" \"r14_lisp(a_text4)\")(setq key_sel 4)"); 如果选取<字在弧内, 逆时针>
(action_tile "help" "(help \"\" \"dtext\")") ; 如果选取<说明>钮, 启动在线说明文件
(action_tile "cancel" "(done_dialog 0)") ; 如果选取<取消>钮, 结束执行
(action_tile "accept" "(dcl_set) (done_dialog 1)") ; 如果选取<确定>钮, 执行dcl_set子程序
(setq ok_id (start_dialog)) ; 令对话框开始接受使用者输入数据
(unload_dialog dcl_flag) ; 释放DCL档案
(if (and (= 1 ok_id) (/= "" text_str)) ; 如果选取<确定>钮, 且"字符串"栏不是空白
(do_text text_str text_high base_gap text_styl key_sel) ; 执行"弧状排列"子程序
); end of if
(setq styl_list nil text_str nil text_high nil base_gap nil text_styl nil ) ; 变数归零
(setvar "blipmode" 1) ; 还原系统变量的设定值
(setvar "cmdecho" 1)
(setvar "osmode" 2087)
(prin1)
); end of ARC_TEXT ; 函式ARC_TEXT至此结束
; 设定对话框中各<键>的初始值
; base_gap 尺寸标注时文字与标注线的间隙
;
(defun dcl_tile_init (/ base_gap) ; 指定函式名称
(dcl_image "key_image" "r14_lisp(a_text1)")
(set_tile "key_type_a" "1") ; 预设开启第一个<选台钮>
(set_tile "dcl_text_high" (rtos (getvar "textsize"))) ; 将字高填入对话框
(setq base_gap (/ (getvar "dimgap") 6.0)) ; 间隙值
(if (< base_gap 0.1) (setq base_gap 0.1))
(set_tile "dcl_base_gap" (rtos base_gap 2 1)) ; 将间隙值填入对话框
(find_styl) ; 将<字型名称串行>填入下拉式清单选窗
); end of dcl_tile_init ; 函式 dcl_tile_init至此结束
; 将幻灯片档案填入影像区
(defun dcl_image (dcl_key image_name / img_width img_height) ; 指定函式名称
(start_image dcl_key) ; 启动影像处理功能
(setq img_width (dimx_tile dcl_key) ; 取得影像区的宽度
img_height (dimy_tile dcl_key) ; 取得影像区的高度
); end of setq
(fill_image 0 0 img_width img_height 0) ; 对影像区填入白色底色
(slide_image 0 -7 img_width img_height image_name) ; 对影像区填入幻灯片档案
(end_image) ; 结束影像处理功能
); end of dcl_image ; 函式dcl_image至此结束
; 读取图文件中的<字型对象>, 并将<字型名称串行>填入对话框的下拉式<清单选窗>
; styl_list 字型名称串行
; styl_data 字型对象的DXF群码数据
; styl_name 字型对象的名称
; curr_styl 目前字型的名称
; curr_ordr <字型名称串行>里目前字型后方的字型串行
; styl_no 字型的数目
; ordr_no <字型名称串行>里位在目前字型后方的字型数目
; styl_id 目前字型在<字型名称串行>里的项次
;
(defun find_styl (/ styl_data styl_name curr_styl curr_ordr styl_no ordr_no styl_id ) ; 指定函式名称
(setq styl_list nil) ; 变数归零
(setq styl_data (tblnext "style" T)) ; 读取符号表中的第一项<字型对象>
(while (/= styl_data nil) ; 如果读取到一个<字型对象>, 则继续执行while循环内的程序代码
(setq styl_name (cdr (assoc 2 styl_data))) ; 读取<字型对象>的<字型名称>
(if (/= (substr styl_name 1 1) "") ; 将第一字为空白的字型略去
(setq styl_list (cons styl_name styl_list )) ; 建立<字型名称串行>
); end of if
(setq styl_data (tblnext "style")) ; 读取次一个<字型对象>
); end of while ; while循环至此结束
(setq styl_list (acad_strlsort styl_list)) ; 将<字型名称串行>依升幂排列
(start_list "dcl_styl_popup") ; 开启下拉式<清单选窗>填入功能
(mapcar 'add_list styl_list) ; 执行填入下拉式<清单选窗>的动作
(end_list) ; 关闭下拉式<清单选窗>填入功能
(setq curr_styl (getvar "textstyle")) ; 读取目前字型的名称
(setq curr_ordr (member curr_styl styl_list))
(setq styl_no (length styl_list)) ; 计算< 字型名称串行>的元素数目
(setq ordr_no (length curr_ordr))
(setq styl_id (- styl_no ordr_no))
(set_tile "dcl_styl_popup" (itoa styl_id)) ; 下拉式<清单选窗>的默认值
); end of find_styl ; 函式find_styl至此结束
; 读取使用者在<对话框>中的选项设定
; text_str 使用者指定的字符串内容
; text_high 使用者指定的字高
; base_gap 文字与圆弧的间隙
; text_styl 使用者选用的字型
;
(defun dcl_set ()
(setq text_str (get_tile "dcl_text_str"))
(setq text_high (atof (get_tile "dcl_text_high")))
(setq base_gap (atof (get_tile "dcl_base_gap")))
(setq text_styl (atoi (get_tile "dcl_styl_popup")))
(setq text_styl (nth text_styl styl_list))
); end of dcl_set ; 函式dcl_set至此结束
; 执行"弧状排列字符串"动作
; text_str 使用者指定的字符串内容
; text_high 使用者指定的字高
; base_gap 文字与圆弧的间隙
; text_styl 使用者选用的字型
; key_sel 使用者在对话框里<选台钮>的选项指针
; text_1st 使用者指定字符串的第一个字符
; text_type 中文or英文?
; text_no 字符数目
; ent_sel 使用者选取的像素
; ent_data 像素的群码数据
; rad 圆弧半径
; dg1 圆弧起点角度
; dg2 圆弧终点角度
; ang_delta 字符之间的角度差
; ang_text 字符的角度
; rad2 弧状字符与圆弧中心点的距离
; text_just 弧状字符的文字对正模式
; text_id 字符指针
; pt1 字符的书写基准点
; text_rot 字符的旋转角度
; text_char 书写的单个字符
;
(defun do_text (text_str text_high base_gap text_styl key_sel / text_1st text_type text_no ent_sel ent_data pt0 rad dg1 dg2 ang_delta ang_text rad2 text_just text_id pt1 text_rot text_char ) ; 指定函式名称
(setq text_1st (ascii (substr text_str 1 1))) ; 第一个字符, 是否在0~9、A~Z、a~z范围之内?
(if (< text_1st 122) (setq text_type "E") ; 判定为英文字符串
(setq text_type "C") ) ; 判定为中文字符串
(if (= text_type "E") ; 计算字符串的长度
(setq text_no (strlen text_str))
(setq text_no (/ (strlen text_str) 2)) ; 中文字符串两个字符视为一个单字
); end of if
(if (setq ent_sel (entsel "\n请选取圆弧像素: ")) ; 指定弧状排列文字的基准圆弧
(progn
(setq ent_data (entget (car ent_sel))) ; 指向像素的像素群码数据
(if (= (cdr (assoc 0 ent_data)) "ARC") ; 像素类型是否为ARC?
(progn ; 如果选取的是圆弧像素
(setq pt0 (cdr (assoc 10 ent_data))) ; 中心点
(setq rad (cdr (assoc 40 ent_data))) ; 圆弧半径
(setq dg1 (cdr (assoc 50 ent_data))) ; 圆弧起点角度
(setq dg2 (cdr (assoc 51 ent_data))) ; 圆弧终点角度
(if (< dg2 dg1) ; 如果圆弧终点角度小于圆弧起点角度
(setq dg2 (+ dg2 pi pi)) ; 将圆弧终点角度增加360度
); end of if
(setq ang_delta (/ (- dg2 dg1) (1- text_no))) ; 字符之间的角度差
(cond
((= key_sel 1) (progn
(setq ang_text dg2) ; 第一个字符的角度
(setq rad2 (+ rad base_gap)) ; 弧状字符与圆弧中心点的距离
(setq text_just "BC") ; 弧状字符的文字对正模式
))
((= key_sel 2) (progn
(setq ang_text dg2)
(setq rad2 (- rad base_gap))
(setq text_just "TC")
))
((= key_sel 3) (progn
(setq ang_delta (- 0 ang_delta)) ; 字符之间的角度差改为负值
(setq ang_text dg1)
(setq rad2 (+ rad base_gap))
(setq text_just "BC")
))
((= key_sel 4) (progn
(setq ang_delta (- 0 ang_delta))
(setq ang_text dg1)
(setq rad2 (- rad base_gap))
(setq text_just "TC")
))
); end of cond
(setq text_id 1) ; 字符指针
(repeat text_no ; 依序书写各个字符
(setq pt1 (polar pt0 ang_text rad2)) ; 字符的书写基准点
(setq text_rot (- (/ (* ang_text 180) pi) 90)) ; 字符的旋转角度
(if (= text_type "E")
(setq text_char (substr text_str text_id 1)) ; 取出要书写的字符
(setq text_char (substr text_str text_id 2))
)
(command "_text" "s" text_styl "j" text_just pt1 text_high text_rot text_char) ; 写出文字
(if (= text_type "E") ; 指向次一个字符
(setq text_id (1+ text_id))
(setq text_id (+ text_id 2))
)
(setq ang_text (- ang_text ang_delta)) ; 次一个字符的角度
); end of repeat
); end of progn ARC
(prompt "\n您所选取的像素, 不是 <圆弧> 像素 !! ") ; 如果选取的不是圆弧像素
); end of if ARC
); end of progn ENTSEL
); end of if ENTSEL
); end of do_text ; 函式do_text至此结束
; 载入档案时的提示文句
(prompt "\n.")
(prompt "\n<功能> 将文字依选取的圆弧弧状排列")
(prompt "\n.")
(prompt "\n<指令> ARC_TEXT")
(prompt "\n.")
(prin1) |
|