贾大师的专栏

五.AutoLisp进阶1.使用ActiveX对象

我们可以把整个AutoCAD理解为一个对象的模型,包括样式设置对象,组织结构对象,图形显示对象,,图元对象,AutoCAD本身也是一个对象。这些对象根据包含关系组成了层次结构,称为对象模型。既然为对象,那么就有属性值和方法。下面我们根据一个例子讲下ActiveX对象的使用方法。我们将使用三种方法完成。

例:画直线,根据图元名称获得其对象,并得到直线的两个端点。并将直线向x轴负方向挪动1000。

1.1ActiveX对象属性的操作

(1) 选择直线工具,在cad绘图窗口中绘制一条直线

(2)打开VisualLisp,在控制台窗口键入如下代码:

_$ (vl-load-com)_$ (setq line-object (vlax-ename->vla-object (entlast)))#<VLA-OBJECT IAcadLine 0000000030624d58>

图表2ActiveX对象检验

接下来我们使用Lisp代码完成读取工作

_$ (setq endp (vla-get-endpoint line-object))#<variant 8197 …>_$ (setq endp2 (vlax-variant-value endp))#<safearray…>_$ (setq endp3 (vlax-safearray->list endp2))(1007.6 3440.77 0.0)_$(setq startp3 (vlax-safearray->list (vlax-variant-value (vla-get-startpoint (vlax-ename->vla-object (entlast))))))(234.156 3400.91 0.0)

接下来设置新的坐标

_$ (setq newEndP (list (- (nth 0 endp3) 1000) (nth 1 endp3) (nth 2 endp3)))(7.6 3440.77 0.0)_$ (setq newStartP (list (- (nth 0 startp3) 1000) (nth 1 startp3) (nth 2 startp3)))(-765.844 3400.91 0.0)_$ (setq NewEndP2 (vlax-make-safearray vlax-vbDouble '(0 . 2)))#<safearray…>_$ (vlax-safearray-fill NewEndP2 NewEndP)#<safearray…>_$ (setq NewStartP2 (vlax-make-safearray vlax-vbDouble '(0 . 2)))#<safearray…>_$ (vlax-safearray-fill NewStartP2 NewStartP)#<safearray…>_$ (vla-put-startpoint line-object NewStartP2)nil_$ (vla-put-endpoint line-object NewEndP2)Nil_$(setq ent1 (entget (entlast)))_$(setq oldEndp (assoc 11 ent1));终点坐标DXF组码值为11_$ (setq oldStartp (assoc 10 ent1));起点坐标DXF组码值为10_$ (setq newEndp (list 10 (- (nth 1 oldEndp) 1000) (nth 2 oldEndp) (nth 3 oldEndp)))_$ (setq newStartp (list 10 (- (nth 1 oldStartp) 1000) (nth 2 oldStartp) (nth 3 oldStartp)))_$ (setq ENT1 (subst newEndp oldEndp ENT1))_$ (setq ENT1 (subst newStartp oldStartp ENT1))_$ (entmod ENT1)1.2ActiveX对象属性的操作_$ (vlax-dump-object line-object t); IAcadLine: AutoCAD Line 接口;特性值:; Angle (RO) = 0.620333; Application (RO) = #<VLA-OBJECT IAcadApplication 000000013f993318>; Delta (RO) = (1361.03 972.338 0.0); Document (RO) = #<VLA-OBJECT IAcadDocument 000000002fb96bc8>; EndPoint = (1458.44 1051.22 0.0); EntityTransparency = "ByLayer"; Handle (RO) = "236"; HasExtensionDictionary (RO) = 0; Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 0000000039a12ad8>; Layer = "0"; Length (RO) = 1672.68; Linetype = "ByLayer"; LinetypeScale = 1.0; Lineweight = -1; Material = "ByLayer"; Normal = (0.0 0.0 1.0); ObjectID (RO) = 42; ObjectID32 (RO) = 42; ObjectName (RO) = "AcDbLine"; OwnerID (RO) = 43; OwnerID32 (RO) = 43; PlotStyleName = "ByLayer"; StartPoint = (97.4054 78.8798 0.0); Thickness = 0.0; TrueColor = #<VLA-OBJECT IAcadAcCmColor 0000000039a12890>; Visible = -1;支持的方法:; ArrayPolar (3); ArrayRectangular (6); Copy (); Delete (); GetBoundingBox (2); GetExtensionDictionary (); GetXData (3); Highlight (1); IntersectWith (2); Mirror (2); Mirror3D (3); <span style="color:#ff0000;">Move (2)</span>; Offset (1); Rotate (2); Rotate3D (3); ScaleEntity (2); SetXData (2); TransformBy (1); Update ()

图表3Move方法帮助

_$ (setq Point1 (vlax-make-safearray vlax-vbDouble '(0 . 2)))#<safearray…>_$ (setq Point2 (vlax-make-safearray vlax-vbDouble '(0 . 2)))#<safearray…>_$ (vlax-safearray-fill Point1 (list 0 0 0))#<safearray…>_$ (vlax-safearray-fill Point2 (list -1000 0 0))#<safearray…>_$ (setq Point1 (vlax-make-variant Point1)) ;;转换为变体类型,非必须#<variant 8197 …>_$ (setq Point2 (vlax-make-variant Point2)) ;;非必须#<variant 8197 …>_$ (vlax-invoke-method line-object "Move" Point1 Point2)Nil2.ActiveX对象交互

在VisualLisp环境中,也可以使用其他应用程序的ActiveX对象。笔者在开发的时候,遇到XML和CAD信息交互的问题,上网搜索,发现没有解析XML的LISP库,如果自己写XML解析,势必大大影响项目进展。终于在ActiveX对象中找到灵感,下载了一个XML的ActiveX控件,加载到自己的程序里完成项目开发。(见我的另一篇博客,AutoLisp中XML解析方案)

【欢迎转载,请注明出处】

婚姻犹如一艘雕刻的船,看你怎样去欣赏它,又怎样驾驭它。

贾大师的专栏

相关文章:

你感兴趣的文章:

标签云: