明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4573|回复: 18

如何输入弧形排列的中文

  [复制链接]
发表于 2002-5-20 14:10 | 显示全部楼层 |阅读模式
arctext命令只可以输入弧形排列的中文西文字体,如何输入弧形排列的中文字呢?
发表于 2002-5-20 19:30 | 显示全部楼层

用下面的程序...

(Defun C:ArcT (/ acn enl cen ang rad teh txt ttt txn)
       (SetQ acn (Car (EntSel "\n选定圆弧或圆:"))
             enl (EntGet acn)
             cen (Cdr (Assoc 10 enl)) ;圆心
             ang (GetPoint cen "\n第一个字中下点位置: ")
             rad (Distance cen ang)
             ang (Angle cen ang)
             teh (GetDist "\n字高度:")
             txt (GetString "\n文字: ")
             txw (* 0.5 (Car (Cadr (TextBox (List '(1 . "M")(Cons 40 teh)))))) ;单字半宽度
             tan (* 2.5 (ATan txw rad))
       )
       (SetQ txn 1)
       (Repeat (StrLen txt)
               (Command "text" "bc" (Polar cen ang rad) teh (AngToS (- ang (* 0.5 Pi)))
                                    (If (Progn (SetQ ttt (SubStr txt txn 1))
                                               (> (ASCII ttt) 160)
                                        )
                                        (Progn (SetQ ttt (SubStr txt txn 2)
                                                     txn (+ 2 txn)
                                               )
                                               ttt
                                        )
                                        (Progn (SetQ txn (1+ txn))
                                               ttt
                                        )
                                    )
               )
               (SetQ ang (- ang tan))
       )
)
发表于 2002-6-12 13:01 | 显示全部楼层

陈老师,是否有BUG

我用了您写的这个程序后,老出现AUTOCAD2002死掉的情况,所有的功能都没了,就是说鼠标点什么都反应了,是怎么回事
发表于 2002-6-12 13:55 | 显示全部楼层

怪哉!一个小LISP程序把AutoCAD搞死,实在罕见。您别是用的盗版吧?

发表于 2002-6-12 14:09 | 显示全部楼层

陈开始故意逗我们的吧?

这个论坛上的人,恐怕没有几个用正版的吧?再说,ACAD里面有弧形文本的功能啊?
发表于 2002-6-12 14:23 | 显示全部楼层

呵呵~~~`````反正是网上下的

别人破解的,正版的修改货~~~~
发表于 2002-6-12 17:12 | 显示全部楼层

试试这个!!!我未用过小心又死机!!!

/*        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)
发表于 2002-6-12 20:57 | 显示全部楼层

AutoCAD的弧形写字不支持汉字的...

发表于 2002-6-13 08:27 | 显示全部楼层

输入弧形排列的中文

我的AutoCAD能按弧形排例中文,用Arc Alingned Text功能,然后选择中文字体就行了。
发表于 2002-6-13 08:56 | 显示全部楼层

^_^,陈老师终于不感到寂寞了。

陈老师发现错误应该是一个惊喜啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-27 15:41 , Processed in 0.356194 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表