Skip to content
On this page

文字样式表

在DWG数据库中,文字样式存放在文字样式表 McDbTextStyleTable() 中,文字样式表中每一条记录称为文字样式表记录对象 McDbTextStyleTableRecord() 。每一个文字样式表记录对象都对应着一种文字样式,可以设置文字样式属性:字体文件名,大字体文件名,新建文本高度,新建文本宽度缩放比例,文字倾斜角度,TrueType字体数据等。其中,文字样式是随图纸保存,不同的图纸使用的文字样式都可能会不一样。DWG数据库默认总是有一个"Standard"文字样式,该文字样式不能被删除。

我们可以通过调用 mxcad 中的 MxCpp.getCurrentMxCAD() 得到当前的控件, 然后调用控件实例的 getDatabase() 方法得到数据库实例 McDbDatabase() ,在该数据库实例中调用 getTextStyleTable() 方法我们就能获取到文字样式表 McDbTextStyleTable() 。

点击 文字样式表 McDbTextStyleTable()文字样式表记录对象 McDbTextStyleTableRecord()数据库实例 McDbDatabase() 查看详细属性和方法说明。

ts
import { MxCpp} from "mxcad"
// 得到当前控件
const mxcad = MxCpp.getCurrentMxCAD();
// 拿到当前文字样式表
const textSyleTable = mxcad.getDatabase().getTextStyleTable();

当前文字样式

当前文字样式表示向DWG数据库添加一个文字对象时,使用的默认的文字样式。我们可以通过调用数据库实例 McDbDatabase()对象中的 getCurrentlyTextStyleName() 方法获取当前文字样式的名字和 getCurrentlyTextStyleId() 方法获取文字样式id。

点击McDbDatabase.getCurrentlyLayerId() 查看详细属性和方法说明。

ts
import { MxCpp } from "mxcad"

const mxcad = MxCpp.getCurrentMxCAD();
const textStyleName = mxcad.getDatabase().getCurrentlyTextStyleName();
const textStyleId = mxcad.getDatabase().getCurrentlyTextStyleId();
console.log("当前文字样式", textStyleName, textStyleId)

添加文字样式

我们可以直接调用 mxcad 实例对象中的 addTextStyle() 方法添加文字样式,再设置 drawTextStyle 属性将添加的文字样式设置为当前绘制文字样式。

点击 McObject.addTextStyle() 查看详细属性和方法说明。

ts
import { McApp } from "mxcad"

const mxcad = McApp.getCurrentMxCAD()
mxcad.addTextStyle("MyLineTypeTextStyle", "txt.shx", "hztxt.shx", 1);
mxcad.drawLayer = "MyLineTypeTextStyle"

此外,我们还可以通过得到当前数据库中的文字样式表 McDbTextStyleTable() ,然后向样式表中添加一个文字样式表记录对象McDbTextStyleTableRecord() 。

ts
import { McCmColor, MxCpp, McDbTextStyleTableRecord, McDb } from "mxcad"

const mxcad = MxCpp.getCurrentMxCAD();
// 拿到当前文字样式表
const textSyleTable = mxcad.getDatabase().getTextStyleTable();
let newTextStyleRecord = new McDbTextStyleTableRecord();
newTextStyleRecord.fileName = "txt.shx";
newTextStyleRecord.bigFontFileName = "hztxt.shx";
newTextStyleRecord.textSize = 10;
newTextStyleRecord.name = sMyTextStyle;
newTextStyleRecord.xScale = 0.7;
if (textSyleTable.add(newTextStyleRecord).isValid()) {
console.log("add ok");
}

遍历所有文字样式

我们可以通过调用文字样式表 McDbTextStyleTable() 中的 getAllRecordId() 方法获取所有文字样式的id,再调用 getMcDbTextStyleTableRecord() 方法返回文字样式表记录对象 McDbTextStyleTableRecord() ,得到所有文字样式数据。

ts
import { MxCpp } from "mxcad"

let mxcad = MxCpp.getCurrentMxCAD();
let textSyleTable = mxcad.getDatabase().getTextStyleTable();
let aryId = textSyleTable.getAllRecordId();
aryId.forEach((id) => {
    let textSyleRec = id.getMcDbTextStyleTableRecord();
    if (textSyleRec === null) return;
    console.log(textSyleRec);
    console.log("textSyleRec.fileName:" + textSyleRec.fileName);
    console.log("textSyleRec.name:" + textSyleRec.name);
});

删除文字样式

我们得到目标文字样式表记录对象 McDbTextStyleTableRecord() 后可调用该对象实例的 erase() 方法删除对象。

ts
import { MxCpp } from "mxcad"

let textSyleTable = MxCpp.getCurrentMxCAD().getDatabase().getTextStyleTable()
let textStyleId = textSyleTable.get("目标文字样式名")
textStyleId.erase()
// 更新显示
mxcad.updateDisplay()

提示

在删除文字样式前,最好判断图上有没有文字对象正在使用该文字样式。

修改文字样式

mxcad 中修改文字样式的基础操作为得到文字样式表,然后根据文字样式名或文字样式ID得到文字样式表记录对象,设置文字样式表记录对象对应属性值。下面以让用户在CAD图上选择一个文字对象,然后操作对象所应用文字样式为例:

ts
import { MxCADSelectionSet, MxCADUiPrPoint, MxCADResbuf } from "mxcad"

const ss = new MxCADSelectionSet();
const getPoint = new MxCADUiPrPoint()
const filter = new MxCADResbuf();
// 添加对象类型,选择集只选择文字类型的对象
filter.AddMcDbEntityTypes("TEXT,MTEXT");
getPoint.setMessage("请选择目标对象")
const point = await getPoint.go()
if (!point) return;
const index = ss.pointSelect(point.x, point.y,filter)
const ent = ss.item(index).getMcDbEntity()
if(!ent) return
let textStyleId = ent.textStyleId
let textStyleRec = textStyleId.getMcDbTextStyleTableRecord()
console.log(textStyleRec)
// 修改文字样式的字体高度
textStyleRec.textSize = 10
// 修改文字宽度缩放比例
textStyleRec.xScale = 0.7
// 修改文字倾斜角度
textStyleRec.obliquingAngle = 0.3

修改文字对象的文字样式

文字对象都一个textStyle属性,用这个属性可以设置,或取到文字对象的文字样式。下面以设置一个文字对象的文字样式为宋体为例。

ts
// 修改对象文字样式
import { MxCpp } from "mxcad";

let mxcad = MxCpp.getCurrentMxCAD();
//清空当前显示内容
mxcad.newFile();
MxCpp.App.loadFonts([], [], ["syadobe","simsun"], () => {
    // 添加一个黑体文字样式
    mxcad.AddTureTypeTextStyle("ht_style","syadobe");
    // 添加一个宋体文字样式
    mxcad.AddTureTypeTextStyle("st_style","simsun");
    // 设置当前样式为黑体
    mxcad.drawTextStyle = "ht_style";
    mxcad.drawColor = new McCmColor(200, 255, 50);
    let idText = mxcad.drawText(0, 3500, "绘图控件TrueType文字测试", 100, 0, 0, 1);
    let ent = idText.getMcDbEntity();
    // 修改文字样式为宋体
    if(ent) ent.textStyle = "st_style";
    mxcad.zoomAll();
    mxcad.regen();
    mxcad.updateDisplay();
});

获取字体文件

我们可以调用文字记录表 McDbTextStyleTableRecord 中的 fileName 属性获取西文字体文件名,调用 bigFontFileName 属性获取中文字体文件名。下面我们以得到图所有文字对象使用的字体文件为例,通过遍历图上所有CAD文字对象获取它使用的字体信息。

点击 McDbTextStyleTableRecord.fileNameMcDbTextStyleTableRecord.bigFontFileName 查看详细属性和方法说明。

ts
import { MxCpp, MxCADSelectionSet } from "mxcad";

const mxcad = MxCpp.getCurrentMxCAD();
// 获取数据表
const dataBase = mxcad.getDatabase();
// 返回数据库中的文字样式表表对象
const textStyleTable = dataBase.getTextStyleTable();
// 定义选择集对象
const ss = new MxCADSelectionSet();
// 全选图上所有对象。
ss.allSelect();
// 遍历所有对象
for(let i = 0; i<ss.count();i++){
    const ent = ss.item(i).getMcDbEntity();
    // 得到对象使用的文字样式记录
    const rec = textStyleTable.get(ent.textStyle).getMcDbTextStyleTableRecord();
    if(rec === null) continue;
    // 得到西文字体
    const sShxFileName = rec.fileName;
    // 得到中文字体
    const sBigShxFileName = rec.bigFontFileName;  
    console.log("西文字体", sShxFileName)     
    console.log("中文字体", sBigShxFileName)     
}