Visual LISP 程序设计 第10章_第1页
Visual LISP 程序设计 第10章_第2页
Visual LISP 程序设计 第10章_第3页
Visual LISP 程序设计 第10章_第4页
Visual LISP 程序设计 第10章_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章在AutoLISP中使用ActiveX对象 ActiveXAutomation是一种新的方法 通过它可以用编程的方式操作AutoCAD图形 在许多操作AutoCAD图形对象的实例中 ActiveX的速度比传统的AutoLISP函数要快 在某些情况下 例如在反应器回调函数中访问图形对象时 只能使用ActiveX 许多语言和环境可以使用ActiveX编程界面 如C VisualBasic Java和Delphi等 在AutoLISP中使用ActiveX对象 其模型 特性和方法和在其他编程环境中使用的ActiveX对象完全相同 如果要在AutoLISP中使用ActiveX函数 必须首先调用vl load com函数来初始化ActiveX环境 vl load com函数首先检查是否加载了ActiveX支持的函数 如果已加载 该函数不做任何工作 否则将加载ActiveX和其他VisualLISP扩展部分的函数 本章所有实例的前提是已调用了vl load com函数 10 1AutoCAD对象模型对象是ActiveX应用程序的主要组成部分 例如 直线 圆弧 多义线和圆等都被称为图形对象 但在使用ActiveX时 以下AutoCAD概念也被称为对象 样式设置对象 如线型 linetype 文本样式 style 和尺寸样式 dimstyle 等 组织结构对象 如图层 layer 和块 block 等 图形显示对象 如视图 view 和视口 viewport 图形的模型空间 modelspace 和图纸空间 paperspace 甚至连图形和AutoCAD本身都被认为是对象 AutoCAD用层次结构来组织它的对象 结构的根是应用程序对象 即AutoCAD本身 该层次结构被称为AutoCAD的对象模型 见图10 1 图10 1AutoCAD对象模型图 AutoCAD的所有对象都有一个或多个特性 特性用于描述对象 例如 圆具有半径 面积 线型等特性 通过半径 面积 线型等特性描述一个具体的圆 椭圆具有面积和线型特性 虽然没有半径这个特性 但可以用其长轴和短轴的比例来描述它 下一级对象也是其上级对象的特性 AutoCAD的对象还包括方法 它们是为特定类型的对象所提供的操作 某些方法可应用于大多数图形对象 例如 Mirror 镜像 和Move 平移 方法 而另一些方法 如Offset 等距线 只能应用到圆弧 圆 椭圆和直线等少数几种图形对象 AutoCAD通过集合将所有对象进行分类 例如 块集合是由AutoCAD图形中的所有块定义组成的 而模型空间集合则包括模型空间中的所有的图形对象 圆 直线 多义线等 10 2通过函数访问AutoCAD对象访问AutoCAD对象之前 建立了名字为 作业1 的图形文件 该文件除了 0 层之外还建立了 图层1 图层1是当前层 依次绘制了起点为 10 20 终点为 60 20 的一条直线和圆心为 35 20 半径为15的一个圆 下面沿着图10 1所示的AutoCAD对象模型图 按照 应用程序 活动文档 模型空间 图形对象 的顺序 访问这条直线和这个圆 10 2 1访问AutoCAD应用程序1 获取AutoCAD应用程序AutoCAD应用程序即AutoCAD本身 是AutoCAD所有对象的根对象 是访问所有AutoCAD对象的起点 获取AutoCAD应用程序对象 只能通过函数vlax get acad object 格式如下 setqmyacad vlax get acad object 该函数没有参数 返回指向AutoCAD应用程序的指针 返回值的数据类型为VLA 即VLISPActiveX对象 该表达式将指向AutoCAD应用程序的指针赋给了变量myacad 2 了解AutoCAD应用程序的特性和方法 vlax dump objectVLA对象 T 该函数的功能是列出指定VLA对象的特性和方法 参数为VLA对象 如果未设置T 只列出指定VLA对象的特性 例如返回 vlax dump objectmyacad 返回 IAcadApplication AninstanceoftheAutoCADapplication 特性值 ActiveDocument Application RO Caption RO AutoCAD2010 D CAD 作业1 dwg Documents RO FullName RO C ProgramFiles AutoCAD2010 acad exe Height 938 HWND RO 197266 LocaleId RO 2052 MenuBar RO MenuGroups RO Name RO AutoCAD Path RO C ProgramFiles AutoCAD2010 Preferences RO StatusId RO 不显示带索引的内容 VBE RO Version RO 17 1s LMSTech Visible 1 Width 1288 WindowLeft 4 WindowState 3 WindowTop 4返回的特性中有以下一行 ActiveDocument 该特性是ActiveDocument 活动的文档 等号后面是它的值 可以看到活动的文档是AutoCAD应用程序的下一级VLA对象 标记为 的特性是VLA对象 例如其中的标题 其他文档 菜单条 菜单组等 可以继续访问VLA对象 引出它的下一级ActiveX对象 了解它们的特性和方法 带有标记 RO 的特性是只读的 不能被修改 例如标题 作业名称和路径等 10 2 2访问其他AutoCAD对象从AutoCAD应用程序开始 利用它的特性 获取和访问它的下一级对象 1 获取活动文档对象获取AutoCAD应用程序之外的对象需要调用vla get property函数 格式如下 vla get propertyobject 参数object必须是VLA对象 property是object的VLA对象类型的特性 该特性可通过vlax dump object函数获得 获取活动文档对象的表达式如下 setqmydoc vla get ActiveDocumentmyacad 返回活动文档的指针 将其赋给变量mydoc 2 了解获取活动文档的特性 vlax dump objectmydoc 返回的特性信息中有以下一行 ModelSpace RO 该特性是ModelSpace 模型空间 是活动文档的特性之一 因此也是活动文档的下一级VLA对象 3 获取模型空间对象 setqmyms vla get ModelSpacemydoc 返回模型空间的指针 将其赋给变量myms 4 了解模型空间的特性和方法 vlax dump objectmymsT 返回的特性信息中有以下一行 Count RO 2该特性是只读的 说明该模型空间当前有两个图形对象 返回的方法信息中有以下内容 Add3DFace 4 Add3DMesh 3 Add3DPoly 1 AddArc 4 AddAttribute 6 AddBox 4 AddCircle 2 AddCone 3 说明模型空间有填加3维剖面等许多创建图形对象的方法 5 获取模型空间的第一个图形对象 setqmyline vla itemmyms0 返回 返回第1个图形对象的指针 将其赋给变量myline 6 了解这条直线的特性和方法 vlax dump objectmylinet 返回 IAcadLine AutoCADLine接口 特性值 Angle RO 0 0 Application RO Delta RO 50 00 00 0 Document RO EndPoint 60 020 00 0 Handle RO 89 HasExtensionDictionary RO 0 Hyperlinks RO Layer 图层1 Length RO 50 0 Linetype ByLayer LinetypeScale 1 0 Lineweight 1 Material ByLayer Normal 0 00 01 0 ObjectID RO 2130402888 ObjectName RO AcDbLine OwnerID RO 2130402552 PlotStyleName ByLayer StartPoint 10 020 00 0 Thickness 0 0 TrueColor Visible 1 支持的方法 ArrayPolar 3 ArrayRectangular 6 Copy Delete GetBoundingBox 2 GetExtensionDictionary GetXData 3 Highlight 1 IntersectWith 2 Mirror 2 Mirror3D 3 Move 2 Offset 1 Rotate 2 Rotate3D 3 ScaleEntity 2 SetXData 2 TransformBy 1 Update 从以上特性的信息中 可以了解到这条直线与X轴正方向夹角为0 3个坐标的增量分别是 50 00 00 0 终点坐标是 60 020 00 0 句柄是89 所在图层的名字是图层1 长度为50 0 线型名是ByLayer 线型比例为1 0 线宽为 1 默认 厚度方向为 0 00 01 0 打印样式名是ByLayer 起点坐标是 10 020 00 0 厚度为0 0等 从以上的方法信息中 可以了解到对这条直线可以施加矩形阵列 环形阵列 复制 删除 包容盒等运算方法 7 获取模型空间的第2个图形对象 setqmycircle vla itemmyms1 返回 返回第2个图形对象 即圆的指针 将其赋给变量mycircle 8 了解这个圆的特性和方法 vlax dump objectmycirclet 返回的有关这个圆的特性信息 其中大部分与直线相同 不同的部份有Area 面积 706 858 Center 圆心 35 020 00 0 Circumference 周长 94 2478 Diameter 直径 30 0和Radius 半径 15 0 返回的有关这个圆的方法信息与直线相同 10 3使用工具了解AutoCAD对象10 3 1使用检验工具了解AutoCAD对象使用检验工具了解AutoCAD对象的仍然按照AutoCAD应用程序 活动文档 模型空间 图形对象的顺序 1 获取AutoCAD应用程序对象获取AutoCAD应用程序对象仍然需要调用函数 setqmyacad vlax get acad object 返回AutoCAD应用程序的指针 将其赋给变量myacad 2 了解AutoCAD应用程序对象要了解VLA对象的特性 首先选取择指向该对象的变量 选取myacad 然后单击按钮 将弹出图10 2所示AutoCAD应用程序的检验窗口 图10 2AutoCAD应用程序的检验窗口 3 了解活动文档的特性双击上图所示AutoCAD应用程序的检验窗口的ActiveDocument特性 将弹出图10 3所示活动文档的检验窗口 图10 3活动文档的检验窗口 4 了解模型空间的特性双击活动文档的检验窗口的ModelSpace特性 将弹出图10 4所示模型空间检验窗口 在该窗口可以看到特性Count的值为2 说明在模型空间当前有两个图形对象 图10 4模型空间检验窗口 5 了解直线的特性由于模型空间的检验窗口没有直线的VLA对象 所以必须以下表达式获取这条直线的VLA对象 setqmyacad vlax get acad object setqmydoc vla get ActiveDocumentmyacad setqmyms vla get ModelSpacemydoc setqmyline vla itemmyms0 以上表达式获取了这条直线的VLA对象的指针 并将其赋给了myline变量 选取myline 然后单击按钮 将弹出图10 5所示这条直线的检验窗口 图10 5直线的检验窗口 6 了解圆的特性同样的理由 必须以下表达式获取这个圆的VLA对象 setqmycircle vla itemmyms1 图10 6圆的检验窗口 以上表达式获取了这个圆的对象的指针 并将其赋给了mycircle变量 选取mycircle 然后单击按钮 将弹出图10 6所示这个圆的检验窗口 不难看出 用检验窗口显示有关VLA对象的特性 与10 2 1节通过vlax dump object函数显示有关VLA对象的特性基本相同 10 3 2通过Help功能了解AutoCAD对象通过Help功能了解AutoCAD对象的步骤是 在VLISP环境下 按功能键F1 在随后显示的AutoCAD2006Help DeveloperDocumentation对话框的目录选项卡内双击 在展开的目录树上双击 在Objects目录下双击AutoCAD图形对象 例如双击 即可显示图10 7所示有关直线对象方法和特性的信息 图10 7有关直线对象方法和特性的帮助信息 以上帮助信息告诉用户创建一条直线用Addline方法 编辑直线用第一列显示的各种方法 第二列显示了直线的全部特性 至此已介绍了了解AutoCAD对象的特性通过帮助功能显示的不难看出 用检验窗口显示有关VLA对象的特性 与10 2节通过vlax dump object函数显示有关VLA对象的特性基本相同 10 4在VisualLISP函数中使用ActiveX方法10 4 1通过Help功能详细了解AutoCAD图形对象的方法上一节的帮助功能和10 2节的vlax dump object函数都提供了AutoCAD图形对象的方法 但这只是一些方法的名称 下面以了解创建一条直线的Addline方法为例 介绍详细了解AutoCAD图形对象的方法 双击图10 7所示有关直线对象帮助信息中的蓝色带下划线的超文本Addline 显示有关创建直线的语法 见图10 8 图10 8创建直线的语法 对于VisualLISP的用户来说 该语法很陌生 因为它是为VisualBasic用户定义的 在VisualBasic环境下 AddLine的语法定义如下 RetVal object AddLine StarPoint EndPoint 其中object是模型空间 图纸空间或图块对象的集合 StarPoint EndPoint是Variant 3个双精度类型元素组成的变体 的数据类型 返回值是直线对象 因此确定VisualLISP函数的创建直线的方法还需要做以下两件事 1 将VisualBasic环境下的语句改写为AutoLISP表达式 2 将AutoLISP的数据转换为ActiveX所需类型的数据 10 4 2将VisualBasic环境下的语句改写为AutoLISP表达式先分析VisualBasic环境下的语句 RetVal object AddLine StartPoint EndPoint RetVal是返回值 object是AddLine的上一级对象 StartPoint和EndPoint是AddLine函数的参数 在VLISPActiveX环境下 模型空间是直线对象的上一级对象 模型空间对象作为AddLine的第一个参数 StartPoint和EndPoint作为AddLine的其余参数 返回值赋给变量myline valx 3d point是VLISPActiveX的函数 其功能是将AutoLISP的3维点转换为ActiveX要求的变体类型的数据 采用AutoLISP表达式为 setqmyline vla addlinemyms vlax 3d point 1020 vlax 3d point 8030 其中myms是模型空间对象的指针 获取该指针的表达式如下 setqmyacad vlax get acad object setqmydoc vla get ActiveDocumentmyacad setqmyms vla get ModelSpacemydoc vlax 3d point是VLISPActiveX的函数 其功能是将AutoLISP的2维或3维点转换为ActiveX要求的变体类型的数据 二者的转换关系见图10 9 图10 9VisualBasic环境下的语句与AutoLISP表达式的对应关系 整数实数字符串VLA对象变体安全数组 vlax true vlax false单字节字符 布尔类型 整数 长整数 单精度实数 双精度实数 对象 字符串 变体 数组 10 4 3ActiveX能够自动进行转换的AutoLISP的一些数据类型AutoLISP和ActiveX有些数据类型的定义是类似的 当ActiveX遇到这样类型的数据时 能够自动进行转换 表10 1所示为ActiveX要求的数据类型和AutoLISP数据类型的关系表 表的第1列为ActiveX要求的数据类型 表的第1行为AutoLISP的数据类型 如果表格的交叉处有加号 表示这样的ActiveX数据类型时可以直接使用相应的AutoLISP数据类型 表10 1AutoLISP数据类型和ActiveX数据类型的关系 10 4 4VisualLISP扩充的数据类型为了实现ActiveX的功能 VisualLISP扩充了一些数据类型 这些数据类型是以前AutoLISP所没有的 1 变体 variant 要想使用ActiveX方法 就必须遵守它的数据声明的规则 对于数量 高度 半径这些数据ActiveX允许AutoLISP使用整型或实型的数据 它可以自动将其转换为长整数或双精度的数据类型 见表10 1 对于起点 终点 圆心这些数据必须经过必要的转换 才能为ActiveX所用 变体实质上是自定义的数据结构 它可以包括不同类型的数据 例如字符串 整数和数组都可以表示为变体 变体的主要特点是数据的类型和值存放在一起 这种自定义的特点 在向ActiveX服务器传递参数时非常有用 因为它使得基于任何语言的服务器都能理解这样的数据 1 创建变体创建变体用vlax make variant函数 调用的格式如下 vlax make variant 值 类型 如果省略参数的值和类型 创建的变体将为vlax vbEmpty类型 未初始化 类型是指变体的类型 见表10 2 表示变体的类型时 可以用它的值 如整型用2 也可以用预定义的类型常量 如vlax vbInteger 最好用预定义的类型常量 因为在后续的AutoCAD版本中类型的值可能会有变化 该函数返回的值为所创建的变体 如果省略参数类型 该函数根据LISP数据值的类型来确定默认的ActiveX数据类型 见表10 3 类型值含义Vlax vbEmpty预定义的变体0未初始化 默认值 Vlax vbNull1空数据Vlax vbInteger2整数型Vlax vbLong3长整数型Vlax vbSingle4单精度浮点数Vlax vbDouble5双精度浮点数Vlax vbString8字符串Vlax vbObject9对象Vlax vbBoolean11布尔值Vlax vbArray8192数组 表10 2预定义的变体类型及其含义 LISP数据值的类型默认的数据类型Nilvlax vbEmptyvlax nullvlax vbNullIntegervlax vbLongRealvlax vbDoubleStringvlax vbStringVLA objectvlax vbObjectvlax true vlax falsevlax vbBooleanVariant与初始值的类型相同vlax make safearrayvlax vbArray 表10 3LISP数据类型与默认的ActiveX数据类型对照表 以下是一些创建变体的表达式 setqvarnil vlax make variant 返回 创建了未初始化的变体 变体的类型为0即vlax vbEmpty 值为nil setqvarint vlax make variant50vlax vbInteger 返回 创建了整型变体 变体的类型为2即vlax vbInteger 值为50 setqvarlng vlax make variant5 返回 创建了长整型变体 变体的类型为3即vlax vbLong 值为5 setqvarstr vlax make variant tsinghua 返回 创建了字符串类型的变体 变体的类型为8即vlax vbString 值为 tsinghua 2 了解变体的数据类型了解变体的数据类型用vlax variant type函数 返回变体的数据类型见表10 2 调用的格式如下 vlax variant typevarnil变体类型的数据 例如 vlax variant typevarnil 返回nil vlax variant typevarint 返回2即vlax vbInteger vlax variant typevarstr 返回8即vlax vbString 3 了解变体的值了解变体的值用vlax variant value函数 调用的格式如下 vlax variant value变体类型的数据 例如 vlax variant valuevarnil 返回nil vlax variant valuevarint 返回50 vlax variant valuevarstr 返回 tsinghua 4 改变变体的数据类型改变变体的数据类型用vlax variant change type函数 数据类型见表10 2 返回转换为指定变体类型后的值 如果不能将var转换为指定类型 则返回nil 调用的格式如下 vlax variant change type变体类型的数据新类型 例如 将名为varint的变量的值设为变体 setqvarint vlax make variant5 返回 将名为varintstr的变量设置为varint中包含的值 但将该值转换为字符串 setqvarintStr vlax variant change typevarintvlax vbstring 返回 检查varintstr的值 vlax variant valuevarintStr 返回 5 这说明varintstr中确实包含字符串 2 安全数组在VLISP中 有可能与一些强制数据类型的编译型应用程序进行数据交换 而这样的程序不可能直接接受AutoLISP特有的表的数据类型 比如ActiveX 为了解决这个矛盾 VLISP设立了安全数组这一数据类型 安全数组是一种特殊的数组 它限制了不能在数组的边界之外赋值 因此不会引起数据异常 所以这类数组是安全的 1 创建安全数组创建安全数组用vlax make safearray函数 调用的格式如下 vlax make safearray类型 下限 上限 下限 上限 该函数要求至少有两个参数 第一个参数是确定该数组中元素的数据类型 可确定的数据类型及其预定义的数据类型如表10 4所示 表10 4可作为安全数组的预定义的数据类型 预定义的变体类型值含义vlax vbInteger2整数Vlax vbLong3长整数Vlax vbSingle4单精度浮点数Vlax vbDouble5双精度浮点数Vlax vbString8字符串Vlax vbObject9对象Vlax vbBoolean11布尔类型Vlax vbVariant12变体 由于它们的值在AutoCAD以后的版本中可能会作修改 所以应该使用预定义的常量 而不要直接使用常量所对应的数值 该函数的其他参数如 下限 上限 下限 上限 为确定数组每维的上下限 其中第一个点对确定第一维的上下限 余类推 下限可为0或任何正负整数 不同的维可以有不同的边界 该函数可创建最多16维的数组 返回值为创建的安全数组 以下是一些创建安全数组的表达式 setqp1 vlax make safearrayvlax vbDouble 0 2 返回 该例创建一个名字为p1的一维数组 下限标为0 上限为2 所以该数组可以存储三个数据为双精度的实数 setqmt2 vlax make safearrayvlax vbString 0 1 1 3 返回 创建一个名字为mt2的二维字符串数组 第一维下限为0 上限为1 包括两个元素 第二维下限为1 上限为3包括三个元素 新创建的数组中的元素按如表10 5所示方式初始化 表10 5新创建的数组中的元素初始化方式 数据类型初始值数值0字符串零长度字符串 布尔值vlax false对象nil变体未初始化 vlax vbEmpty 2 为整个安全数组赋值为整个安全数组赋值用vlax safearray fill函数 调用的格式如下 vlax safearray fill变量 数值表 参数变量必须是安全数组类型的变量 数值表是数值类型的表 表的长度必须等于数组元素的个数 该函数返回 例如 已创建了一个名字为p1的一维数组 下限为0 上限为2 所存数据为双精度实数 用vlax safearray fill函数填满该数组 vlax safearray fillp1 123 返回 如果赋值的元素的数目与数组所包含元素的数目不等 vlax safearray fill函数返回出错信息 例如 vlax safearray fillp1 1234 返回error vlax safearray fillfailed Invalidinitializationlist 错误 函数失败 无效的设置初值的表 对于多维数组 数值表必须为表的列表 其中每个表对应于数组中的一维 例如已创建了一个名字为mt2的二维字符串数组 第一维下限为0 上限为1 包括两个元素 第二维下限为1 上限为3包括三个元素 用vlax safearray fill函数填满该数组 vlax safearray fillmt2 a b c d e f 返回 3 列出安全数组的内容列出安全数组的内容用vlax safearray list函数 调用的格式如下 vlax safearray list安全数组 例如 vlax safearray listp1 返回 1 02 03 0 vlax safearray listmt2 返回 a b c d e f 4 为安全数组内指定的元素赋值为安全数组内指定的元素赋值用vlax safearray put element函数 调用的格式如下 vlax safearray put element变量索引 参数变量的类型为SafeArray的变量 对于一维数组 应指定一个索引值 对于二维数组 应指定两个索引值 依此类推 值是赋给安全数组内指定的元素元素的值 返回指定给数组元素的值 例如 已创建了名字为p1的由双精度数据构成的一维数组 数组的下界为0 上界为2 用vlax safearray put element填满该数组 vlax safearray put elementp1010 返回10 将数组p1的第1个元素赋值为10 vlax safearray put elementp1120 返回20 将数组p1的第2个元素赋值为20 vlax safearray put elementp1230 返回30 将数组p1的第3个元素赋值为30调用vlax safearray list函数确认p1的内容 返回 10 020 030 0 对于二维数组 应指定两个索引值 例如已创建了名字为mt2的由字符串构成的二维数组 第一维下限为0 上限为1 包括两个元素 第二维下限为1 上限为3包括三个元素 每个维的下界为1 上界为2 用vlax safearray put element填满该数组 vlax safearray put elementmt201 a1 返回 a1 vlax safearray put elementmt202 b2 返回 b2 vlax safearray put elementmt203 c3 返回 c3 vlax safearray put elementmt211 d4 返回 d4 vlax safearray put elementmt212 e5 返回 e5 vlax safearray put elementmt213 f6 返回 f6 调用vlax safearray list函数确认mt2的内容 vlax safearray listmt2 返回 a1 b2 c3 d4 e5 f6 5 在变体中使用安全数组安全数组的数据必须用变体传给ActiveX 如果需要为一个数组创建一个变体 就必须先创建数组再转换成变体 例如创建一个包含5个双精度实数数组的变体的步骤如下 给数组分配空间 setqa5 vlax make safearrayvlax vbDouble 0 4 给数组赋值 vlax safearray filla5 1 12 23 34 45 5 将数组存储到变体 setqvara5 vlax make varianta5 返回 这样变量vara5就是一个包含具有5个双精度实数的数组的变体 6 用函数vlax 3d point来创建ActiveX要求的三维点用vlax 3d point函数可以将3个数字的表转换为三维点 调用的格式如下 vlax 3d point三维点表 二维点表 3个数字或2个数字 例如以下表达式都可以将创建ActiveX要求的三维点赋给变量CircleCenter setqCircleCenter vlax 3d point 12 5100 返回 setqCircleCenter vlax 3d point 12 510 返回 setqCircleCenter vlax 3d point12 5100 返回 setqCircleCenter vlax 3d point12 510 返回 也可传给vlax 3d point两个或三个数 而不是表 例如 如果省略参数中的第三个数 即点的Z坐标 vlax 3d point函数将其设置为0 用vlax safearray list函数验证用vlax 3d point函数设置的变量的内容 vlax safearray list vlax variant valuecirccenter 返回 12 510 00 0 10 4 5AutoCAD图元名和VLA对象之间的转换1 将AutoCAD图元名转换为VLA对象函数vlax ename vla object可以将AutoCAD图元名转换为VLA对象 调用格式如下 vlax ename vla objectAutoCAD图元名 返回值为VLA对象 例如 以下表达式获取了当前作业的第一个图形对象的图元名 setqe1 entnext 返回调用vlax ename vla object函数将该图元名转换成VLA对象 setqvla object vlax ename vla objecte1 返回 2 将VLA图形对象转换为AutoCAD图元名函数vlax vla object ename可以将VLA对象转换为AutoCAD图元名 调用格式如下 vlax vla object enameVLA图形对象 返回值为AutoCAD图元名 例如 vla object是标识一个图形对象的VLA对象 以下表达式可以将该VLA对象转换为AutoCAD图元名 setqnew ename vlax vla object enamevla object 返回 10 5获取和修改图形对象的特性10 5 1获取图形对象特性要想获取一个图形对象特性 必须首先获取这个图形对象 有两种获取图形对象的途径 1 沿着AutoCAD对象模型图获取图形对象 见10 2节 2 用AutoLISP有关获取图元名的函数得到图元名 然后将其转换为VLA对象见10 4 5节 假定已经获取了一个VLA对象并赋给了变量my vla object 该对象是一个圆 可以用以下两种函数获取图形对象的特性值 1 用函数vlax get property获取任意ActiveX对象的任意特性 该函数的调用格式如下 vlax get propertyVLA对象property 参数property为符号或字符串 标识要检索的特性 返回VLA对象的特性值 例如 获取标识一个圆的半径 该圆是名字为my vla object的VLA对象 setqradi vlax get propertymy vla object radius 返回50 0获取该圆的面积 setqarea vlax get propertymy vla object area 返回7853 98获取该圆的圆心 setqcntr vlax get propertymy vla object center 返回 返回值为安全数组类型的变体 获取该变体的值 vlax safearray list vlax variant valuecntr 返回 100 080 00 0 获取该圆的颜色 vlax get propertymy vla object Color 返回256 随层 2 用带有vla get前缀的函数 这类函数的调用语法如下 vla get propertyVLA图形对象 该类函数的名字是由vla get 和property合成的 property为符号或字符串 标识要检索的特性 返回VLA对象指定的特性 例如获取该圆的半径 setqrad vla get radiusmy vla object 返回50 0获取该圆的圆心 setqcntr vla get centermy vla object 返回 10 5 2修改图形对象的特性假定已经获取了一个VLA对象并赋给了变量my vla object 该对象是一个圆 可以用以下两种函数修改图形对象的特性 1 用函数vlax put property修改任意ActiveX对象的任意特性函数vlax put property的调用格式如下 vlax put propertyVLA对象property新的特性值 参数property为符号或字符串 标识要修改的特性 例如 修改该圆的半径 vlax put propertymy vla object radius80 返回nil 该圆的位置不变 半径改变为80 修改该圆的面积 vlax put propertymy vla object area2010 返回nil 该圆的位置不变 面积改变为2010 修改该圆的圆心 vlax put propertymy vla object center vlax 3d point 180200 返回nil 该圆的位置改变为 180200 该表达式用vlax 3d point函数将新的圆心表转换为ActiveX所要求的数据类型 修改该圆的颜色 vlax put propertymy vla object Color1 返回nil 该圆改变为红色也可以用预定义的常量来修改对象的特性 例如 如果要将圆的填充颜色设为绿色 可以用常量acGreen代替颜色号3 vla put colormy vla objectacGreen 返回nil 该圆改变为绿红色 2 用带有vla put 前缀的函数 这类函数的调用语法如下 vla put propertyVLA图形对象新的特性值 该类函数的名字是由vla put 和property合成的 property为符号或字符串 标识要修改的特性 例如修改一个圆的半径时 property改为具体的特性radius 20可作为半径这个特性的新值 例如修改该圆的半径 vla put radiusmy vla object20 返回nil 该圆的位置不变 半径改变为20 修改该圆的圆心 vla put centermy vla object vlax 3d point 150500 返回nil 该圆的位置改变为 150500 注意 有可能特性的修改并不立即反映到AutoCAD图形 这是因为AutoCAD对特性修改做了延迟 其目的是为了让用户可以一次修改多个特性 如果需要显式地更新图形窗口 可调用函数vla update 其调用格式如下 vla updateVLA图形对象 10 6确定是否可以修改对象如果在当前程序运行的同时 其他应用程序也在操作某些AutoCAD对象 当前的程序可能无法访问那些对象 这在设计含有反应器的应用程序时非常重要 因为反应器执行相应代码来响应外部事件 而这些外部事件将无法预知 详细信息参见10 7将反应器附着到AutoCAD图形上 有时甚至一个很简单的事情 如图层被锁住 也可能阻止程序改变对象的特性 VLISP提供了下列函数 可用来在操作某对象前 先测试一下是否可访问该对象 lvlax read enabled p测试是否可读该对象 lvlax write enabled p测试是否可修改该对象的特性 lvlax erased p测试该对象是否已被删除 因为被删除的对象可能仍保留在图形数据库中 如果结果为真 这些函数返回T 否则返回nil 下面测试某myline直线对象 1 确定该直线是否可读 vlax read enabled pmyline 返回T 说明可读 2 确定该直线是否可被修改 vlax write enabled pmyline 返回T 说明可被修改 3 确定该直线是否已被删除 vlax erased pmyline 返回nil 说明未被删除 vla deletemyline 删除myline 返回nil 4 调用vlax read enabled p来查看myline是否仍然可读 vlax read enabled pmyline 返回nil 说明不可读 5 再次调用vlax erased p来验证该对象是否已被删除 vlax erased pmyline 返回T 说明已被删除 10 7使用用参数带回返回值的ActiveX方法有些ActiveX方法要求用户给它们提供变量 以使它们能对变量赋值 GetBoundingBox方法就是一例 图10 10是它在ActiveXandVBAReference中的定义 图10 10GetBoundingBox方法的定义 从图10 10可以看到 用GetBoundingBox方法可以获取图形对象边界框的左下角点MinPoint和右上角点MaxPoint 这两个点是在WCS下的三维坐标 假定最后生成的图形对象是以 200 100 为圆心 以50为半径的圆 用GetBoundingBox方法获取该圆边界框的左下角点MinPoint和右上角点MaxPoint 1 获取该圆的图元名 setqec entlast 返回2 将该圆转换为VLA对象 setqmycircle vlax ename vla objectec 返回 3 用GetBoundingBox方法获取该圆边界框的左下角点MinPoint和右上角点MaxPoint vla getboundingboxmyCircle minpoint maxpoint 返回nilvla getboundingbox函数将该圆边界框的左下角点和右上角点的坐标存放在变量minpoint和maxpoint变量 这两个变量 是含有三个双精度实数的安全数组的类型 4 用函数vlax safearray list查看minpoint和maxpoint的值 setqp1 vlax safearray listminpoint 返回 150 03 00 0 setqp2 vlax safearray listmaxpoint 返回 190 020 00 0 10 8判断某方法或特性是否可应用于某对象如果使用了某对象不能应用的方法或的特性 就会导致错误 如果不能确定特性或方法是否可应用于该对象时 应该用函数vlax method applicable p和vlax property available p对该对象进行测试 如果方法或特性可应用到该对象 这些函数返回T 否则返回nil 1 判断某方法是否可应用于某对象 12通过函数vlax method applicable p可以判断某方法是否可应用于某对象 该函数的调用格式如下 vlax method applicable pVLA对象method 参数method为符号或字符串 指定要检查的方法的名称 如果VLA对象支持该方法 返回T 否则返回nil 例如 以下表达式测试copy方法是否可应用到myline指向的直线对象 vlax method applicable pmyline copy 返回T 说明copy方法可以应用到直线对象以下表达式测试AddBox方法是否可应用到myline指向的直线对象 vlax method applicable pmyline AddBox 返回nil 说明AddBox方法不能应用到直线对象2 判断某对象是否具有某特性通过函数vlax property available p可以判断某对象是否具有某特性 该函数的调用格式如下 vlax property available pVLA对象property check modify 参数property为符号或字符串 指定要检查的特性 如果指定参数check modify的值为T 该函数还检查VLA对象的指定特性是否可被修改 只要VLA对象具有指定特性 该函数就返回T 否则返回返回nil 如果指定check modify参数的值为T 而该特性不可用或该特性不能修改 该函数返回nil 例如 下列表达式测试Color和Center是否是myline具有的特性 vlax property available pmyline Color 返回T vlax property available pmyline Center 返回nil假定myCircle是直线一个圆的VLA对象 如果调用该函数时不提供可选参数 T 测试圆的Area特性 vlax property available pmyCircle area 返回T 说明圆具有area特性如果调用该函数时可选参数设置为T 测试圆的Area特性 vlax property available pmyCircle area T 返回T 说明圆具有area特性 而且可以被直接修改 10 9使用集合对象集合的概念是在理解AutoCAD对象模型中引入的 在AutoCAD对象模型中的所有对象都是用集合来分组的 例如 块集合是由AutoCAD文档中的所有块组成的 VLISP提供处理集合对象的函数 该类函数有vlax map collection和vlax for 10 9 1将某一个函数应用到集合中的每一个对象 14vlax map collection函数可将某一个函数应用到集合中的每一个对象 其调用格式如下 vlax map collectioncollection objectfunction 参数collection object代表集合的VLA对象 function为要应用到collection object的函数名或lambda表

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论