使用 Corel 查询语言 (CQL) 在 CorelDRAW 和 Corel DESIGNER 文档中搜索对象

介绍

在为 CorelDRAWCorel DESIGNER 编写宏时,搜索具有特定属性的对象是一项常见任务。通常,如果您需要搜索特定大小或填充的对象,您需要遍历页面上的所有形状,检查每个形状的属性并确定它是否符合条件。

例如,删除所有没有填充和轮廓的对象的宏可能如下所示:

Sub DeleteInvisible()
    Dim s As Shape
    Dim sr As New ShapeRange
    For Each s In ActivePage.Shapes.FindShapes()
        If s.Outline.Type = cdrNoOutline And s.Fill.Type = cdrNoFill Then
            sr.Add s
        End If
    Next s
    sr.Delete
End Sub

对于更复杂的条件,需要进行更多检查。请注意,需要对我们在页面上找到的每个形状进行这些检查。

您还可以在 Shapes.FindShapes 方法中使用一个特殊的查询表达式 ,该表达式允许您过滤该方法返回的形状。提供的表达式使用 CQL 来指定形状必须满足的条件集才能包含在搜索结果中。因此,要使用这种新方法完成删除没有填充和轮廓的对象的相同任务,我们可以像这样重写上面的宏:

Sub DeleteInvisible()
    Dim sr As ShapeRange
    Set sr = ActivePage.Shapes.FindShapes(Query:="@outline.type = 'none' and @fill.type = 'none'")
    sr.Delete
End Sub

可在 FindShapesQuery 参数中使用的条件 可能比这复杂得多。例如,以下宏选择在其填充或轮廓的任何位置具有红色的所有对象:

Sub SelectShapesWithRedColor()
    ActivePage.Shapes.FindShapes(Query:="@colors.find('red')").CreateSelection
End Sub

CQL 数据类型

CQL 是一种面向对象的查询语言。这意味着它所操作的所有数据都是某种类型的对象,并且这些对象具有可以调用以访问这些对象的属性的某些方法。有许多代表数字、字符串等的预定义数据对象,以及专门用于 CQL 所用的特定任务的自定义对象。由于 CQL 不仅可以用于查找文档中的形状,还可以用于其他方面(例如,它可以用于查找具有某些属性(如字体、大小和颜色)的文本字符)。

CQL 常用的内置数据对象有以下几种。这些对象存在于 CQL 的任何实现中:

  • null:表示对象不存在的属性的空对象。
  • bool:布尔值( true或 false)。
  • int :一个整数值(介于 -2147483648 ... 2147483647 之间)。
  • double:浮点值(大约在 10 -308 ... 10 308之间
  • string : Unicode 文本字符串。
  • unit :计量单位。目前可以使用线性测量单位,例如英寸 (in)、毫米 (mm) 和其他一些单位。
  • com: COM 对象的包装器。这允许为形状、填充、轮廓、颜色等对象调用 VBA 对象模型方法。CorelDRAW 和 Corel DESIGNER 对象的 CQL 实现不具有通过对象模型可用的所有属性,因此该对象可以是用于调用对象模型以获取有关对象的附加信息。
  • array :数组 任何 CQL 类型的对象列表。
  • custrom :自定义由 CQL 的特定实现提供的任何其他对象类型。用于在文档中查找形状的 CQL 专门提供自定义对象,例如 形状、填充、 轮廓和 颜色。

CQL语法

计算每个 CQL 表达式以生成单个值(对象)。在文档中查找形状时,会针对文档中的每个形状评估查询表达式,并将结果值转换为布尔值(真或假)以确定给定形状是否符合条件。如果结果为“真”,则将该形状添加到找到的形状列表中,否则将被忽略。

但是,一般来说,CQL 表达式可以计算为任何对象类型,例如整数、字符串、对象数组等。以下是有效 CQL 表达式的几个示例:

1 + 2
2 * (2.3 + 1.2)
'Hello' + 'world'

CorelDRAW 和 Corel DESIGNER 的 VBA 对象模型有一些辅助方法,可让您评估 CQL 表达式和解决查询问题。 Application.Evaluate 就是其中之一;它计算 CQL 表达式并返回计算结果。

Sub TestEvaluate()
    MsgBox Evaluate("2*(2.3+1.2)")
End Sub

上面的宏只会显示一个包含“7”的消息框,这是算术表达式的结果。此方法可用于快速检查 CQL 表达式的有效性或确认结果值。

表达式中的每个操作数都是一个对象,即使是 1 或“Hello”等常量也是如此。对于常量,数据类型是自动确定的。每个对象都可以有自己的一组方法和属性。要调用对象的方法,使用以下语法:

对象.方法(参数)
不需要任何参数的方法可以在不使用括号的情况下调用。以下两个表达式均有效:

'world'.length()
'world'.length

以上两个表达式的计算结果均为数值 5,即字符串“world”的长度。

原文: https://community.coreldraw.com/sdk/w/articles/179/using-corel-query-language-cql-to-search-for-objects-in-coreldraw-and-corel-designer-documents

分类: 学习编程

0 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注