明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索

[原创]获取MText中的可用字符

  [复制链接]
 楼主| 发表于 2004-6-24 21:33 | 显示全部楼层
本帖最后由 作者 于 2004-6-24 22:06:23 编辑

试试这个: {\C3;明经通{\fSimSun|b0|i0|c134|p2;道}\Lhttp://www.mjtd.com{\C3;明经通道\Lhtt\C1;p://www.mj\C3;td.com\l是一个好网站啊,呵呵}
\l是\Ftxt.shx,gbcbig.shx|c134;一个好网站啊,呵呵} 返回 明经通道http://www.mjtd.com明经通道http://www.mjtd.com是一个好网站啊,呵呵是一个好网站啊,呵呵 再一个 "{\C3;明经通{\fSimSun|b0|i0|c134|p2;道}\Lhttp://www.mjtd.com{\C3;明经通道\Lhttp{\C1;://{\C3;www}.mjtd.com}\l是一个好网站啊,呵呵}\l是{\Ftxt.shx,gbcbig.shx|c134;一个好网站}啊,呵呵}"
发表于 2004-6-25 07:31 | 显示全部楼层
已经写出来了,试用中:
  1. Sub MtToDt()
  2.        Dim s As String
  3.        's = ThisDrawing.ModelSpace(0).TextString
  4.        s = "{\C3;明经通{\fSimSun|b0|i0|c134|p2;道}\Lhttp://www.mjtd.com{\C3;明经通道\Lhttp{\C1;://{\C3;www}.mjtd.com}\l是一个好网站啊,呵呵}\l是{\Ftxt.shx,gbcbig.shx|c134;一个好网站}啊,呵呵}"
  5.        Debug.Print s
  6.        s = GetMTextUnformatString(s)
  7.        Debug.Print s
  8.       
  9. End Sub
  10. Public Function GetMTextUnformatString(MTextString As String) As String
  11.        Dim s As String
  12.        Dim RE As RegExp
  13.        Set RE = New RegExp
  14.        RE.IgnoreCase = True
  15.        RE.Global = True
  16.        s = MTextString
  17.        '替换\\字符
  18.        RE.Pattern = "\\\"
  19.        s = RE.Replace(s, Chr(1))
  20.        '删除堆迭格式
  21.        RE.Pattern = "\\S(.[^;]*)(\^|#|\\)(.[^;]*);"
  22.        s = RE.Replace(s, "$1$3")
  23.        '删除字体、颜色、字高、字距、倾斜、字宽、对齐格式
  24.        RE.Pattern = "(\\F|\\C|\\H|\\T|\\Q|\\W|\\A)(.[^;]*);"
  25.        s = RE.Replace(s, "")
  26.        '删除下划线、删除线格式
  27.        RE.Pattern = "(\\L|\\O)"
  28.        s = RE.Replace(s, "")
  29.        '删除不间断空格格式
  30.        RE.Pattern = "\\~"
  31.        s = RE.Replace(s, " ")
  32.        '删除换行符格式
  33.        RE.Pattern = "\\P"
  34.        s = RE.Replace(s, "")
  35.        '删除{}
  36.        RE.Pattern = "({|})"
  37.        s = RE.Replace(s, "")
  38.        '替换回\\字符
  39.        RE.Pattern = "\x01"
  40.        s = RE.Replace(s, "\")
  41.        Set RE = Nothing
  42.        GetMTextUnformatString = s
  43. End Function
 楼主| 发表于 2004-6-25 09:06 | 显示全部楼层
"{\C3;明经通{\fSimSun|b0|i0|c134|p2;道}\L\{http://www.mjtd.com\}{\C3;明经通道\Lhttp{\C1;://{\C3;www}.mjtd.com}\l是一个好网站啊,呵呵}\l是{\Ftxt.shx,gbcbig.shx|c134;一个好网站}啊,呵呵}"



这个例子不行,好像没有考虑        "\{"和"\}"


不过我的好像把"{}"都丢了
 楼主| 发表于 2004-6-25 12:30 | 显示全部楼层
下面的是用栈实现的,
  1. Public Function GetMTextUnformatString(ByVal str As String) As String
  2. On Error Resume Next
  3.        Dim pStrs As New Collection
  4.        Dim pStrack As String
  5.        Dim n As Integer
  6.        Dim pStr As String
  7.        Dim pEnd As String
  8.        Do While Len(str) > 0
  9.                n = IIf(Left(str, 1) = "", 2, 1)
  10.                pStr = Left(str, n)
  11.                If pStr = "}" Then
  12.                        pEnd = pStrs(pStrs.Count)
  13.                        pStrack = ""
  14.                        Do While pEnd <> "{"
  15.                                pStrack = pEnd & pStrack
  16.                                pStrs.Remove pStrs.Count
  17.                                pEnd = pStrs(pStrs.Count)
  18.                        Loop
  19.                        pStrs.Remove pStrs.Count
  20.                        pStrs.Add GetRtfStrig(pStrack)
  21.                Else
  22.                        pStrs.Add Left(str, n)
  23.                End If
  24.                str = Right(str, Len(str) - n)
  25.        Loop
  26.        For Each i In pStrs
  27.                GetMTextUnformatString = GetMTextUnformatString & i
  28.        Next i
  29. End Function
  30. Private Function GetRtfStrig(ByVal str As String) As String
  31.        Dim s As String
  32.        Dim RE As RegExp
  33.        Set RE = New RegExp
  34.        RE.IgnoreCase = True
  35.        RE.Global = True
  36.        s = str
  37.        '替换\\字符
  38.        RE.Pattern = "\\\"
  39.        s = RE.Replace(s, Chr(1))
  40.        '删除堆迭格式
  41.        RE.Pattern = "\\S(.[^;]*)(\^|#|\\)(.[^;]*);"
  42.        s = RE.Replace(s, "$1$3")
  43.        '删除字体、颜色、字高、字距、倾斜、字宽、对齐格式
  44.        RE.Pattern = "(\\F|\\C|\\H|\\T|\\Q|\\W|\\A)(.[^;]*);"
  45.        s = RE.Replace(s, "")
  46.        '删除下划线、删除线格式
  47.        RE.Pattern = "(\\L|\\O)"
  48.        s = RE.Replace(s, "")
  49.        '删除不间断空格格式
  50.        RE.Pattern = "\\~"
  51.        s = RE.Replace(s, " ")
  52.        '删除换行符格式
  53.        RE.Pattern = "\\P"
  54.        s = RE.Replace(s, "")
  55.        '替换{}
  56.        RE.Pattern = "\\{"
  57.        s = RE.Replace(s, "{")
  58.        RE.Pattern = "\\}"
  59.        s = RE.Replace(s, "}")
  60.        '替换回\\字符
  61.        RE.Pattern = "\x01"
  62.        s = RE.Replace(s, "\")
  63.        Set RE = Nothing
  64.        GetRtfStrig = sEnd Function
替换前:"{\C3;\{明经通{\fSimSun|b0|i0|c134|p2;道\}}\Lhttp://www.mjtd.com{\C3;明经通道\Lhttp{\C1;://{\C3;www}.mjtd.com}\l是一个好网站啊,呵呵}\l是{\Ftxt.shx,gbcbig.shx|c134;一个好网站}啊,呵呵}"替换后:{明经通道}http://www.mjtd.com明经通道http://www.mjtd.com是一个好网站啊,呵呵是一个好网站啊,呵呵
发表于 2004-6-25 12:37 | 显示全部楼层
  1. Public Function GetMTextUnformatString(MTextString As String) As String
  2.        Dim s As String
  3.        Dim RE As RegExp
  4.        Set RE = New RegExp
  5.        RE.IgnoreCase = True
  6.        RE.Global = True
  7.        s = MTextString
  8.       
  9.        '替换\\字符
  10.        RE.Pattern = "\\\"
  11.        s = RE.Replace(s, Chr(1))
  12.        '替换\{字符
  13.        RE.Pattern = "\\{"
  14.        s = RE.Replace(s, Chr(2))
  15.        '替换\}字符
  16.        RE.Pattern = "\\}"
  17.        s = RE.Replace(s, Chr(3))
  18.       
  19.        '删除堆迭格式
  20.        RE.Pattern = "\\S(.[^;]*)(\^|#|\\)(.[^;]*);"
  21.        s = RE.Replace(s, "$1$3")
  22.        '删除字体、颜色、字高、字距、倾斜、字宽、对齐格式
  23.        RE.Pattern = "(
 楼主| 发表于 2004-6-25 12:44 | 显示全部楼层
本帖最后由 作者 于 2004-6-25 20:57:51 编辑

如果故意挑点刺的话,下面的测试用例好像有点问题 s = "{\C3;\{明经通{\fSimSun|b0|i0|c134|p2;道\}}\Lhttp://www.mjtd.com{\C3;明经通道\Lhttp{\C1;://{\C3;www}.mjtd.com}\l是一个好网站啊,呵呵}\l是{\Ftxt.shx,gbcbig.shx|c134;一个好网站}啊," & Chr(3) & "呵呵}"
不过我的代码好像也有点问题,改进中。。。
发表于 2004-6-25 21:09 | 显示全部楼层
不错,是有问题,但实际是不可能出现的,因为该字符没有实际意义,通过用户的输入也不可能出现这样的字符,所以不需要考虑这种情况。
发表于 2004-6-25 21:33 | 显示全部楼层
由于AutoCAD没有把分号做为识别符,所以用分号来堆迭会出现异常。所以这里没有把多行文字中的分号做特别处理。
应该说这个程序已经满足要求了。
 楼主| 发表于 2004-6-25 23:32 | 显示全部楼层
本帖最后由 作者 于 2004-6-27 13:00:15 编辑

我又改进了一下,下面的程序基本可用。3楼的代码又重写了一遍
  1. Public Function GetMTextUnformatString(ByVal str As String) As String
  2. '程序功能:按给定的MText字符串返回可用的字符串
  3. On Error Resume Next       Dim pStrs As New Collection
  4.        Dim pStack As Collection
  5.        Dim n As Integer
  6.        Dim pStr As String
  7.        Dim pEnd As String
  8.       
  9.        str = "{" & str & "}"
  10.        Do While Len(str) > 0
  11.       
  12.                n = IIf(Left(str, 1) = "", 2, 1)
  13.                pStr = Left(str, n)
  14.                '分割MText字符串为控制字符或单个字符
  15.                
  16.                If pStr = "}" Then
  17.                '遇"}"时出栈,直到"{"
  18.                
  19.                        pEnd = pStrs(pStrs.Count)
  20.                        Set pStack = New Collection
  21.                        pStack.Add "*TlsCad*"
  22.                        
  23.                        Do While pEnd <> "{"
  24.                               
  25.                                pStack.Add pEnd, , 1
  26.                                pStrs.Remove pStrs.Count
  27.                                pEnd = pStrs(pStrs.Count)
  28.                               
  29.                        Loop
  30.                        
  31.                        pStrs.Remove pStrs.Count
  32.                        pStack.Remove pStack.Count
  33.                        
  34.                        For Each i In GetRtfString(pStack)
  35.                        '调用GetRtfString函数返回可用的字符集合
  36.                        
  37.                                pStrs.Add i
  38.                               
  39.                        Next i
  40.                        
  41.                Else
  42.                '当前字符入栈
  43.                        pStrs.Add Left(str, n)
  44.                        
  45.                End If
  46.                
  47.                str = Right(str, Len(str) - n)
  48.                
  49.        Loop
  50.       
  51.        For Each i In pStrs
  52.        '合并字符集合为字符串
  53.                If Len(i) = 2 Then
  54.                '处理\、{、}
  55.                        GetMTextUnformatString = GetMTextUnformatString & Right(i, 1)
  56.                        
  57.                Else
  58.                
  59.                        GetMTextUnformatString = GetMTextUnformatString & i
  60.                        
  61.                End If
  62.                
  63.        Next i
  64.       
  65. End FunctionPrivate Function GetRtfString(ByVal stack As Collection) As Collection
  66. '程序功能:按给定的Rtf字符集合返回可用的字符集合       Dim pStrs As New Collection
  67.        Dim pStr As String, pType As Long
  68.        Dim i, j
  69.       
  70.        For Each i In stack
  71.                
  72.                If Len(i) = 1 Then
  73.                
  74.                        pStrs.Add i
  75.                        
  76.                ElseIf Len(i) = 2 Then
  77.                
  78.                        pType = Asc(UCase(Right(i, 1)))
  79.                        
  80.                        Select Case pType
  81.                        
  82.                        Case 85, 92, 123, 125
  83.                        '\ or { or } or U
  84.       
  85.                                pStrs.Add i
  86.                               
  87.                        Case 65, 67, 70, 72, 81, 84, 87
  88.                        'A or C or F or H or Q or T or W
  89.                        
  90.                                Do While stack(1) <> ";"
  91.                                        stack.Remove 1
  92.                                Loop
  93.                                stack.Remove 1
  94.                               
  95.                        Case 76, 79, 80
  96.                        'L or O or P
  97.                        
  98.                        Case 83
  99.                        'S
  100.                        
  101.                                stack.Remove 1
  102.                                Do While stack(1) <> ";"
  103.                                        If stack(1) <> "^" Then
  104.                                                pStrs.Add stack(1)
  105.                                        End If
  106.                                        stack.Remove 1
  107.                                Loop
  108.                                stack.Remove 1
  109.                               
  110.                        Case 126
  111.                        '~
  112.                        
  113.                                pStrs.Add " "
  114.                               
  115.                        End Select
  116.                        
  117.                End If
  118.       
  119.        Next i       Set GetRtfString = pStrs
  120.       
  121. End Function
 楼主| 发表于 2004-6-27 13:26 | 显示全部楼层
意犹未尽,再来段VB.Net的
  1.               '程序功能:返回MText中的可用字符串
  2.        Public Function GetMTextUnFormatString(ByVal str As String) As String
  3.                Dim pQueue As System.Collections.Queue
  4.                Dim pSubStack As System.Collections.Stack
  5.                Dim pStack As New System.Collections.Stack
  6.                Dim pNum As Short
  7.                Dim pStr, i As String
  8.                Try
  9.                        str = "{" & str & "}"
  10.                        '将MText字符串分割为控制符和单个字符
  11.                        Do While str.Length > 0
  12.                                pNum = IIf(str.Substring(0, 1) = "", 2, 1)
  13.                                '当前字符为"}"时顺序出栈,直到遇到第一个"{"
  14.                                If pNum = 1 And str.Substring(0, 1) = "}" Then
  15.                                        pSubStack = New System.Collections.Stack
  16.                                        Do While Convert.ToString(pStack.Peek()) <> "{"
  17.                                                pSubStack.Push(pStack.Pop())
  18.                                        Loop
  19.                                        pStack.Pop()
  20.                                        '调用GetRtfTextUnFormatString函数返回Rtf字符栈中的可用字符队列
  21.                                        pQueue = GetRtfTextUnFormatString(pSubStack)
  22.                                        '将可用字符队列顺序入栈
  23.                                        Do While pQueue.Count > 0
  24.                                                pStack.Push(pQueue.Dequeue)
  25.                                        Loop
  26.                                Else
  27.                                        '当前字符入栈
  28.                                        pStack.Push(str.Substring(0, pNum))
  29.                                End If
  30.                                str = str.Substring(pNum)
  31.                        Loop                       '返回栈中的可用字符串
  32.                        For Each i In pStack.ToArray
  33.                                If i.Length = 1 Then
  34.                                        pStr = i & pStr
  35.                                ElseIf i.Length = 2 Then
  36.                                        pStr = i.Substring(1, 1) & pStr
  37.                                End If
  38.                        Next i
  39.                        Return pStr
  40.                Catch ex As Exception
  41.                        Return ""
  42.                End Try       End Function       '程序功能:返回Rtf字符栈中的可用字符队列
  43.        Private Function GetRtfTextUnFormatString(ByVal stack As System.Collections.Stack) As System.Collections.Queue
  44.                Dim i As Object
  45.                Dim pStr As String
  46.                Dim pQueue As New System.Collections.Queue
  47.                Try
  48.                        '顺序出栈
  49.                        Do While stack.Count > 0
  50.                                pStr = Convert.ToString(stack.Pop)
  51.                                '当前的单个字符入队
  52.                                If pStr.Length = 1 Then
  53.                                        pQueue.Enqueue(pStr)
  54.                                Else
  55.                                        '处理控制字符
  56.                                        Select Case pStr.Substring(1, 1).ToUpper
  57.                                                Case "", "{", "}", "U"
  58.                                                        pQueue.Enqueue(pStr)
  59.                                                Case "A", "C", "F", "H", "Q", "T", "W"
  60.                                                        Do While Convert.ToString(stack.Pop()) <> ";"
  61.                                                        Loop
  62.                                                Case "L", "O", "P"
  63.                                                Case "S"
  64.                                                        Do While Convert.ToString(stack.Peek()) <> ";"
  65.                                                                If stack.Peek <> "^" Then
  66.                                                                        pQueue.Enqueue(stack.Pop())
  67.                                                                Else
  68.                                                                        stack.Pop()
  69.                                                                End If
  70.                                                        Loop
  71.                                                        stack.Pop()
  72.                                                Case "~"
  73.                                                        pQueue.Enqueue(" ")
  74.                                        End Select
  75.                                End If
  76.                        Loop
  77.                Catch ex As Exception
  78.                End Try
  79.                Return pQueue
  80.        End Function
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-28 22:45 , Processed in 0.293413 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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