You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AutoCAD VBA中正确获取阿拉伯/波斯SHX文本的完整字符内容?

解决AutoCAD VBA读取阿拉伯/波斯SHX文本时字符变为?的问题

问题根源在于AutoCAD的TextString属性默认使用系统ANSI代码页(如1252)读取文本,而阿拉伯/波斯SHX字体的字符属于代码页1256,无法识别的字符会被替换为?。AutoCAD属性面板会自动根据字体对应的代码页解析字符,所以能正常显示。以下是两种可行解决方案:

方法1:修改DWG代码页并转换编码

通过临时修改DWG的代码页为阿拉伯语代码页(1256),再将读取的ANSI字符串转换为Unicode,即可获取完整字符:

Private Sub convertBtn_Click()
    Dim txt As String
    Dim textObject As AcadText
    Dim actSelSet As AcadSelectionSet
    Dim originalCodePage As String
    
    ThisDrawing.Activate
    ' 保存原始代码页,避免影响后续操作
    originalCodePage = ThisDrawing.GetVariable("DWGCODEPAGE")
    ' 设置为阿拉伯语代码页
    ThisDrawing.SetVariable "DWGCODEPAGE", "1256"
    
    Set actSelSet = ThisDrawing.PickfirstSelectionSet
    For Each i In actSelSet
        If TypeOf i Is AcadText Then
            ' 读取文本并转换为Unicode
            txt = StrConv(i.TextString, vbUnicode, 1256)
            Debug.Print txt
            textStringConversion.strToAsc txt
        End If
    Next i
    
    ' 恢复原始代码页
    ThisDrawing.SetVariable "DWGCODEPAGE", originalCodePage
End Sub

方法2:读取DXF原始文本并映射字体形状码

如果使用的是自定义SHX字体(非标准1256编码),需要直接读取DXF中的原始形状码文本,再根据SHX字体的字符映射表转换为Unicode:

步骤1:读取DXF原始文本和字体信息

Private Sub convertBtn_Click()
    Dim rawTxt As String
    Dim textObject As AcadText
    Dim actSelSet As AcadSelectionSet
    Dim dxfData As Variant
    Dim styleName As String
    Dim styleObj As AcadTextStyle
    
    ThisDrawing.Activate
    Set actSelSet = ThisDrawing.PickfirstSelectionSet
    
    For Each i In actSelSet
        If TypeOf i Is AcadText Then
            ' 读取DXF代码1的原始形状码文本
            i.GetDxfData 1, dxfData
            rawTxt = dxfData(0)
            
            ' 获取文本样式对应的SHX字体文件路径
            styleName = i.StyleName
            Set styleObj = ThisDrawing.TextStyles(styleName)
            
            Debug.Print "原始形状码:" & rawTxt
            Debug.Print "关联SHX字体:" & styleObj.FontFile
            
            ' 调用自定义映射函数转换为Unicode
            ' Dim convertedTxt As String
            ' convertedTxt = MapShxCodesToUnicode(rawTxt, styleObj.FontFile)
            ' textStringConversion.strToAsc convertedTxt
        End If
    Next i
End Sub

步骤2:实现SHX字体映射逻辑

SHX是二进制字体格式,需要解析其内部的形状定义与字符映射规则。你需要编写代码读取SHX文件的二进制数据,提取每个形状码对应的Unicode字符(可参考AutoCAD官方DXF文档中关于SHX字体的结构说明)。

内容的提问来源于stack exchange,提问作者Ash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 14:18:35