autocad二次开发.ppt
本土化,包括语言、标准和习惯等,二次开发的意义,减少重复劳动,满足不同特定企业、行业的需要,比如 CAXA系列、开目CAD 天河CAD、InteCAD 中望CAD、尧创CAD、浩辰CAD,企业产品:系列化,面向对象:所有工业部门的 功能:全而不专,圆柱齿轮、锥齿轮、非圆齿轮、齿条等,阀门行业换热器行业锅炉行业,AutoLisp,ADS,DCL,ADSRX,ObjectARX,Activex,VBA,VLisp,Automation,Autocad 开发方式及发展,第一代AutoLisp,概 述,1986年随AutoCAD v2.18提供的二次开发工具。是嵌入AutoCAD内部的COMMON LISP的一个子集。是唯一的一种解释型语言使用AutoLISP可直接调用几乎所有的AutoCAD命令AutoLISP语言的应用 最典型应用之一是实现参数化绘图程序设计,包括尺寸驱动程序和鼠标拖动程序等。另一个典型应用就是驱动AutoCAD提供PDB模块构成DCL(Dialog Control Language)文件,创建自己的对话框。,(defun c:11(/p1 p2)(setq p1(getpoint 输入第一个点)(setq p2(getpoint 输入第二个点)(command line p1 p2),Defun 函数-定义函数,(defun 函数名(函数参数/变量表)表达式),例如定义一个加3 函数,程序源代码如下:(defun mul 3(x)(setq x(+3 x),(defun C:AutoCAD命令名(/局部变数表)表达式,setq:赋值函数作用:给变量进行赋值。格式:(setq name value name value.)其中Name为变量名 Value为赋予变量的值,(函数名函数参数.),Auto LISP 以表的形式调用函数,其格式如下,这里的函数参数的数量可能为 0,也可以为任意多个,这取决于具体的函数。每个参数还可以是表达式,返回的是表达式的最终计算结果。每调用一个函数都会得到函数的结果,即函数的返回值。有的函数返回的是数值,有的函数返回的是逻辑常数T 或者 nil,这取决于函数princ(打印字符)函数,比如(princ)。调用自定义函数的方法与调用系统提供的函数的方法相同,例如:,Auto LISP 用command 函数调用AutoCAD 命令,其格式如下。(command“AutoCAD命令”“命令所需的数据”),(command“line”“6,9”“18,27”“”),List函数List函数用于定义一个二维或三维点,若表达式中不包含任何变量及未定义项,则该函数还可以使用单引号()命名。示例(setq(List 2.5 3.56)返回 2.5,3.56(setq(2.5 3.56)返回 2.5,3.56,car、cdr与cadr函数1.car函数 car函数返回一个表中的第一个元素。若表中不包含任何元素,函数返回nil。car函数格式为:(car List)其中car.返回第一个元素 list.元素列表示例:(car(2.5 3.56)返回 2.5(car(x)返回(car(15 20)56)返回(15 20)(car()返回 nil其中的单引号表示个表。,2.cdr函数 cdr函数返回一个移去了表的第一个元素后的列表,其格式为(cdr List)其中cdr.返回第一个元素被移去的列表 list.元素列表示例:(cdr(2.5 3.56)返回(3.56)(cdr(,y,z)返回(y,)(cdr(15 20)56)返回(56)(cdr()返回nil,3.cadr函数 cadr函数执行两个操作,cdr和car,返回列表中第二个元素。cdr函数移去了第一个元素。car函数返回新表中的第一个元素。、cadr函数的格式为:(cadr List)其中 cadr.执行两个操作(car(cdr()List元素列表 示例:(cadr(2 3)返回3(cadr(2 3 56)返回3(cadr(x))返回(cadr(15 20)56 24)返回56 这些例子中,cadr执行两个操作(cadr()=(car(cdr()=(car(y z)返回,princ函数Princ函数打印(或显示)变量的值。若变量位于双引号中,该函数打印(或显示)双引号内的表达式。princ函数的格式为:(Princ变量或表达式)示例:(princ)在屏幕上打印一个空行(princ)在屏幕上打印出变量的值(princ“Welcome”)在屏幕上打印Welcome,运行错误有以下两种情况(1)语法错误:没有按程序规定的语言写程序,这是低级错误。(2)逻辑错误:程序员错误地理解了计算机所要完成的任务,这是高级错误,对于一个程序员来说要尽量避免。无意输入错误变量名对计算机而言也属于这种错误。,(defun c:11(/p1 p2)(setq p1(getpoint 输入第一个点)(setq p2(getpoint 输入第二个点)(command line p1 p2),画线,(defun c:rect1(/p1 p2 p3 p4)(graphscr)(setvar cmdecho 0)(prompt rect1 command draws a rectangle)(terpri)(setq p1(getpoint Enter first corner)(terpri)(setq p3(getpoint Enter opposite corner)(terpri)(setq p2(list(car p3)(cadr p1)(setq p4(list(car p1)(cadr p3)(command line p1 p2 p3 p4 c)(setvar cmdecho 1)(Princ),画矩形,(defun C:BA()(setq allarea 0)(print 请拾取内部一个点)(while(setq pt(getpoint)(command boundary pt)(command area o l)(setq allarea(+allarea(getvararea)(print 总面积是)(print allarea)(print 请拾取内部一个点),累计面积计算,(1)语言规则十分简单,易学易用;(2)直接针对AutoCAD,易于交互;(3)解释执行,立竿见影。,优 点,第一代AutoLisp,(1)功能单一,综合处理能力差;(2)解释执行,程序运行速度慢;(3)缺乏很好的保护机制,源程序保密性差;(4)LISP用表来描述一切,并不能很好地反映现实世界和过程,跟人的思维方式也不一致;(5)不能直接访问硬件设备、进行二进制文件的读写。AutoLISP的这些特点,使其仅适合于有能力的终端用户完成一些自己的开发任务。,缺 点,第一代AutoLisp,什么是宏?,计算机中宏又称为宏命令,即通过特殊的控制语,将一系列动作简便化;即:一种批处理的程序,AutoCad中的宏,就是一个程序工具集,用VBA,LISP一类的语言编程,完成一个相对复杂的工具集合,也是用编程语言的方式简化软件操作的过程。,word 或 ppt 中的宏比如:将图片批量删除或批量修改图片尺寸,Public Sub macrodemo()MsgBox“欢迎使用VBA”End Sub,例题1,Sub c100()Dim cc(0 To 2)As Double 声明坐标变量cc(0)=1000 定义圆心坐标cc(1)=1000cc(2)=0For i=1 To 1000 Step 10 开始循环Call ThisDrawing.ModelSpace.AddCircle(cc,i*10)画圆vNext iEnd Sub,例题 2,Sub c100()Dim cc(0 To 2)As Double 声明坐标变量cc(0)=1000 定义圆心坐标cc(1)=1000cc(2)=0For i=1 To 1000 Step 10 开始循环Call ThisDrawing.ModelSpace.AddCircle(cc,i*10)画圆vNext iEnd Sub,例题 2,Sub和end sub标志程序的开始和结束C100 宏的名称,也叫过程名称 当用户执行 C100 时,程序将运行 sub 和 end sub 之间的所有指令,Sub c100()Dim cc(0 To 2)As Double 声明坐标变量cc(0)=1000 定义圆心坐标cc(1)=1000cc(2)=0For i=1 To 1000 Step 10 开始循环Call ThisDrawing.ModelSpace.AddCircle(cc,i*10)画圆vNext iEnd Sub,cc 变量名cc()数组cc(0 To 2)数组有三个元素:CC(0)、CC(1)、CC(2)As Double 数据类型是双精度型声明坐标变量注释语法:Dim 变量名 As 数据类型将cc作为坐标数组,存储坐标值,坐标值是双精度型例:Dim a As single Dim cc(1 To 3)As Long,例题 2,Sub c100()Dim cc(0 To 2)As Double 声明坐标变量cc(0)=1000 定义圆心坐标cc(1)=1000cc(2)=0For i=1 To 1000 Step 10 开始循环Call ThisDrawing.ModelSpace.AddCircle(cc,i*10)画圆vNext iEnd Sub,cc(0)x坐标cc(0)内存储x的坐标值1000,例题 2,Sub c100()Dim cc(0 To 2)As Double 声明坐标变量cc(0)=1000 定义圆心坐标cc(1)=1000cc(2)=0For i=1 To 1000 Step 10 开始循环Call ThisDrawing.ModelSpace.AddCircle(cc,i*10)画圆vNext iEnd Sub,cc(1)y坐标cc(1)内存储y的坐标值1000,例题 2,Sub c100()Dim cc(0 To 2)As Double 声明坐标变量cc(0)=1000 定义圆心坐标cc(1)=1000cc(2)=0For i=1 To 1000 Step 10 开始循环Call ThisDrawing.ModelSpace.AddCircle(cc,i*10)画圆vNext iEnd Sub,cc(2)z坐标cc(2)内存储z的坐标值0,例题 2,Sub c100()Dim cc(0 To 2)As Double 声明坐标变量cc(0)=1000 定义圆心坐标cc(1)=1000cc(2)=0For i=1 To 1000 Step 10 开始循环Call ThisDrawing.ModelSpace.AddCircle(cc,i*10)画圆vNext iEnd Sub,语法:For 变量=数值1 To 数值2 Step 数值3For循环语句i 变量(变换范围:数值1到数值2)数值3 数值1变化到数值2的步长,例题 2,Sub c100()Dim cc(0 To 2)As Double 声明坐标变量cc(0)=1000 定义圆心坐标cc(1)=1000cc(2)=0For i=1 To 1000 Step 10 开始循环Call ThisDrawing.ModelSpace.AddCircle(cc,i*10)画圆vNext iEnd Sub,Call调用其他程序或方法ThisDrawing.ModelSpace当前CAD文档的模型空间AddCircle 画圆方法,需要两个参数:圆心和半径CC()圆心坐标,i*10 圆的半径这些圆的半径分别是,例题 2,10、110、210、310,Sub c100()Dim cc(0 To 2)As Double 声明坐标变量cc(0)=1000 定义圆心坐标cc(1)=1000cc(2)=0For i=1 To 1000 Step 10 开始循环Call ThisDrawing.ModelSpace.AddCircle(cc,i*10)画圆vNext iEnd Sub,Next与For语句配套,例题 2,Sub c100()Dim cc(0 To 2)As Double 声明坐标变量cc(0)=1000 定义圆心坐标cc(1)=1000cc(2)=0For i=1 To 1000 Step 10 开始循环Call ThisDrawing.ModelSpace.AddCircle(cc,i*10)画圆vNext iEnd Sub,例题 2,坐标值的输入:程序写入手动输入鼠标拾取,Submy1()Dimp1AsVariant申明端点坐标Dimp2AsVariantp1=ThisDrawing.Utility.GetPoint(,输入点:)获取点坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p1(2)=z将Z坐标值赋予点坐标中OnErrorGo ToErr_Control出错陷井Do开始循环p2=ThisDrawing.Utility.GetPoint(p1,vbCr&输入下一点:)获取下一个点的坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p2(2)=z将Z坐标值赋予点坐标中CallThisDrawing.ModelSpace.AddLine(p1,p2)画直线p1=p2将第二点的端点保存为下一条直线的第一个端点坐标LoopErr_Control:EndSub,例题 3,Submy1()Dimp1AsVariant申明端点坐标Dimp2AsVariantp1=ThisDrawing.Utility.GetPoint(,输入点:)获取点坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p1(2)=z将Z坐标值赋予点坐标中OnErrorGo ToErr_Control出错陷井Do开始循环p2=ThisDrawing.Utility.GetPoint(p1,vbCr&输入下一点:)获取下一个点的坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p2(2)=z将Z坐标值赋予点坐标中CallThisDrawing.ModelSpace.AddLine(p1,p2)画直线p1=p2将第二点的端点保存为下一条直线的第一个端点坐标LoopErr_Control:EndSub,Sub和end sub标志程序的开始和结束my1 宏的名称,Submy1()Dimp1AsVariant申明端点坐标Dimp2AsVariantp1=ThisDrawing.Utility.GetPoint(,输入点:)获取点坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p1(2)=z将Z坐标值赋予点坐标中OnErrorGo ToErr_Control出错陷井Do开始循环p2=ThisDrawing.Utility.GetPoint(p1,vbCr&输入下一点:)获取下一个点的坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p2(2)=z将Z坐标值赋予点坐标中CallThisDrawing.ModelSpace.AddLine(p1,p2)画直线p1=p2将第二点的端点保存为下一条直线的第一个端点坐标LoopErr_Control:EndSub,定义 p1和 p2 存放坐标 variant,Submy1()Dimp1AsVariant申明端点坐标Dimp2AsVariantp1=ThisDrawing.Utility.GetPoint(,输入点:)获取点坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p1(2)=z将Z坐标值赋予点坐标中OnErrorGo ToErr_Control出错陷井Do开始循环p2=ThisDrawing.Utility.GetPoint(p1,vbCr&输入下一点:)获取下一个点的坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p2(2)=z将Z坐标值赋予点坐标中CallThisDrawing.ModelSpace.AddLine(p1,p2)画直线p1=p2将第二点的端点保存为下一条直线的第一个端点坐标LoopErr_Control:EndSub,Utility 提示用户输入 Getpoint 输入点格式:Getpoint(参考点,“提示信息”)Getpoint(p1,“请输入一个点p2”)起点p1,终点p2跟随鼠标移动(不画实线),Submy1()Dimp1AsVariant申明端点坐标Dimp2AsVariantp1=ThisDrawing.Utility.GetPoint(,输入点:)获取点坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p1(2)=z将Z坐标值赋予点坐标中OnErrorGo ToErr_Control出错陷井Do开始循环p2=ThisDrawing.Utility.GetPoint(p1,vbCr&输入下一点:)获取下一个点的坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p2(2)=z将Z坐标值赋予点坐标中CallThisDrawing.ModelSpace.AddLine(p1,p2)画直线p1=p2将第二点的端点保存为下一条直线的第一个端点坐标LoopErr_Control:EndSub,Utility 提示用户输入 GetReal输入数值格式:GetReal(“提示信息”),Submy1()Dimp1AsVariant申明端点坐标Dimp2AsVariantp1=ThisDrawing.Utility.GetPoint(,输入点:)获取点坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p1(2)=z将Z坐标值赋予点坐标中OnErrorGo ToErr_Control出错陷井Do开始循环p2=ThisDrawing.Utility.GetPoint(p1,vbCr&输入下一点:)获取下一个点的坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p2(2)=z将Z坐标值赋予点坐标中CallThisDrawing.ModelSpace.AddLine(p1,p2)画直线p1=p2将第二点的端点保存为下一条直线的第一个端点坐标LoopErr_Control:EndSub,P1(2)-数组中的第三个数存放位置 即z坐标值存放位置,Submy1()Dimp1AsVariant申明端点坐标Dimp2AsVariantp1=ThisDrawing.Utility.GetPoint(,输入点:)获取点坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p1(2)=z将Z坐标值赋予点坐标中OnErrorGoToErr_Control出错陷井Do开始循环p2=ThisDrawing.Utility.GetPoint(p1,vbCr&输入下一点:)获取下一个点的坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p2(2)=z将Z坐标值赋予点坐标中CallThisDrawing.ModelSpace.AddLine(p1,p2)画直线p1=p2将第二点的端点保存为下一条直线的第一个端点坐标LoopErr_Control:EndSub,On Error-出错陷井语句GoTo跳转语句,Submy1()Dimp1AsVariant申明端点坐标Dimp2AsVariantp1=ThisDrawing.Utility.GetPoint(,输入点:)获取点坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p1(2)=z将Z坐标值赋予点坐标中OnErrorGoToErr_Control出错陷井Do开始循环p2=ThisDrawing.Utility.GetPoint(p1,vbCr&输入下一点:)获取下一个点的坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p2(2)=z将Z坐标值赋予点坐标中CallThisDrawing.ModelSpace.AddLine(p1,p2)画直线p1=p2将第二点的端点保存为下一条直线的第一个端点坐标LoopErr_Control:EndSub,Do循环开始标志Loop循环结束标志,Submy1()Dimp1AsVariant申明端点坐标Dimp2AsVariantp1=ThisDrawing.Utility.GetPoint(,输入点:)获取点坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p1(2)=z将Z坐标值赋予点坐标中OnErrorGoToErr_Control出错陷井Do开始循环p2=ThisDrawing.Utility.GetPoint(p1,vbCr&输入下一点:)获取下一个点的坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p2(2)=z将Z坐标值赋予点坐标中CallThisDrawing.ModelSpace.AddLine(p1,p2)画直线p1=p2将第二点的端点保存为下一条直线的第一个端点坐标LoopErr_Control:EndSub,将输入点赋给p2,从p1开始,橡皮线连着p2,Submy1()Dimp1AsVariant申明端点坐标Dimp2AsVariantp1=ThisDrawing.Utility.GetPoint(,输入点:)获取点坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p1(2)=z将Z坐标值赋予点坐标中OnErrorGoToErr_Control出错陷井Do开始循环p2=ThisDrawing.Utility.GetPoint(p1,vbCr&输入下一点:)获取下一个点的坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p2(2)=z将Z坐标值赋予点坐标中CallThisDrawing.ModelSpace.AddLine(p1,p2)画直线p1=p2将第二点的端点保存为下一条直线的第一个端点坐标LoopErr_Control:EndSub,将输入的值赋给z,Submy1()Dimp1AsVariant申明端点坐标Dimp2AsVariantp1=ThisDrawing.Utility.GetPoint(,输入点:)获取点坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p1(2)=z将Z坐标值赋予点坐标中OnErrorGoToErr_Control出错陷井Do开始循环p2=ThisDrawing.Utility.GetPoint(p1,vbCr&输入下一点:)获取下一个点的坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p2(2)=z将Z坐标值赋予点坐标中CallThisDrawing.ModelSpace.AddLine(p1,p2)画直线p1=p2将第二点的端点保存为下一条直线的第一个端点坐标LoopErr_Control:EndSub,再将Z值放入数组中,p2有x、y、z三个坐标值,Submy1()Dimp1AsVariant申明端点坐标Dimp2AsVariantp1=ThisDrawing.Utility.GetPoint(,输入点:)获取点坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p1(2)=z将Z坐标值赋予点坐标中OnErrorGoToErr_Control出错陷井Do开始循环p2=ThisDrawing.Utility.GetPoint(p1,vbCr&输入下一点:)获取下一个点的坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p2(2)=z将Z坐标值赋予点坐标中CallThisDrawing.ModelSpace.AddLine(p1,p2)画直线p1=p2将第二点的端点保存为下一条直线的第一个端点坐标LoopErr_Control:EndSub,当前CAD文档.模型空间.画线,Submy1()Dimp1AsVariant申明端点坐标Dimp2AsVariantp1=ThisDrawing.Utility.GetPoint(,输入点:)获取点坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p1(2)=z将Z坐标值赋予点坐标中OnErrorGoToErr_Control出错陷井Do开始循环p2=ThisDrawing.Utility.GetPoint(p1,vbCr&输入下一点:)获取下一个点的坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p2(2)=z将Z坐标值赋予点坐标中CallThisDrawing.ModelSpace.AddLine(p1,p2)画直线p1=p2将第二点的端点保存为下一条直线的第一个端点坐标LoopErr_Control:EndSub,将第一条线的第二点作为第二条线第一点,Submy1()Dimp1AsVariant申明端点坐标Dimp2AsVariantp1=ThisDrawing.Utility.GetPoint(,输入点:)获取点坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p1(2)=z将Z坐标值赋予点坐标中OnErrorGoToErr_Control出错陷井Do开始循环p2=ThisDrawing.Utility.GetPoint(p1,vbCr&输入下一点:)获取下一个点的坐标z=ThisDrawing.Utility.GetReal(Z坐标:)用户输入Z坐标值p2(2)=z将Z坐标值赋予点坐标中CallThisDrawing.ModelSpace.AddLine(p1,p2)画直线p1=p2将第二点的端点保存为下一条直线的第一个端点坐标LoopErr_Control:EndSub,出错后跳转到Err_Control,执行之后的语句,基本变换,透视变换,平移变换,全比例变换,a b c pd e f qh I j rl m n s,图形变换矩阵,Private Sub cmdscale_click()Dim Transmatrix(0 To 3,0 To 3)As Double Dim indexl As Integer,index2 As Integer For index1=0 To 3 For index2=0 To 3 Transmatrix(index1,index2)=0 Next Next Transmatrix(0,0)=CDbl(Txtscalefactor)Transmatrix(1,1)=CDbl(Txtscalefactor)Transmatrix(2,2)=CDbl(Txtscalefactor)Transmatrix(3,3)=1 With ThisDrawing.ModelSpace.Item(.Count-1).TransformBy(Transmatrix).Item(.Count-1).color=acRed.Item(.Count-1).Update End With Unload MeEnd Sub,定义矩阵并初始化,矩阵赋值,图形转换修改颜色更新,Dim Transmatrix(0 To 3,0 To 3)As Double Dim index1 As Integer,index2 As Integer For index1=0 To 3 For index2=0 To 3 Transmatrix(index1,index2)=0 Next Next,Dim Transmatrix(0 To 3,0 To 3)As Double Dim indexl As Integer,index2 As Integer For index1=0 To 3 For index2=0 To 3 Transmatrix(index1,index2)=0 Next Next,定义 Transmatrix:4*4矩阵数据类型:Double,Dim Transmatrix(0 To 3,0 To 3)As Double Dim index1 As Integer,index2 As Integer For index1=0 To 3 For index2=0 To 3 Transmatrix(index1,index2)=0 Next Next,定义 index1:行数 index2:列数数据类型:Integer,Dim Transmatrix(0 To 3,0 To 3)As Double Dim index1 As Integer,index2 As Integer For index1=0 To 3 For index2=0 To 3 Transmatrix(index1,index2)=0 Next Next,内层循环:第一行为零,Dim Transmatrix(0 To 3,0 To 3)As Double Dim index1 As Integer,index2 As Integer For index1=0 To 3 For index2=0 To 3 Transmatrix(index1,index2)=0 Next Next,外层循环:行列都置零,Transmatrix(0,0)=CDbl(Txtscalefactor)Transmatrix(1,1)=CDbl(Txtscalefactor)Transmatrix(2,2)=CDbl(Txtscalefactor)Transmatrix(3,3)=1,Transmatrix(0,0)=CDbl(Txtscalefactor)Transmatrix(1,1)=CDbl(Txtscalefactor)Transmatrix(2,2)=CDbl(Txtscalefactor)Transmatrix(3,3)=1,将文本框内的值赋给矩阵(0,0)位置,Transmatrix(0,0)=CDbl(Txtscalefactor)Transmatrix(1,1)=CDbl(Txtscalefactor)Transmatrix(2,2)=CDbl(Txtscalefactor)Transmatrix(3,3)=1,将文本框内的值赋给矩阵(1,1)位置,Transmatrix(0,0)=CDbl(Txtscalefactor)Transmatrix(1,1)=CDbl(Txtscalefactor)Transmatrix(2,2)=CDbl(Txtscalefactor)Transmatrix(3,3)=1,将文本框内的值赋给矩阵(2,2)位置,Transmatrix(0,0)=CDbl(Txtscalefactor)Transmatrix(1,1)=CDbl(Txtscalefactor)Transmatrix(2,2)=CDbl(Txtscalefactor)Transmatrix(3,3)=1,矩阵(1,1)位置赋值 1,With ThisDrawing.ModelSpace.Item(.Count-1).TransformBy(Transmatrix).Item(.Count-1).color=acRed.Item(.Count-1).Update End With,With ThisDrawing.ModelSpace.Item(.Count-1).TransformBy(Transmatrix).Item(.Count-1).color=acRed.Item(.Count-1).Update End With,使用With 可以省略书写内容结尾:end with,With ThisDrawing.ModelSpace.Item(.Count-1).TransformBy(Transmatrix).Item(.Count-1).color=acRed.Item(.Count-1).Update End With,TransformBy:图形矩阵转换命令,With ThisDrawing.ModelSpace.Item(.Count-1).TransformBy(Transmatrix).Item(.Count-1).color=acRed.Item(.Count-1).Update End With,改变转换后图形颜色,With ThisDrawing.ModelSpace.Item(.Count-1).TransformBy(Transmatrix).Item(.Count-1).color=acRed.Item(.Count-1).Update End With,更新图形,Private Sub cmdscaleToCenter_click()Centerpoint=ThisDrawing.Utility.GetPoint(,输入缩放点)Dim Transmatrix(0 To 3,0 To 3)As Double Dim indexl As Integer,index2 As Integer For index1=0 To 3 For index2=0 To 3 Transmatrix(index1,index2)=0 Next Next Dim scalefactor As Double scalefactor=frmtransformations.Txtscalefactor Transmatrix(0,0)=CDbl(Txtscalefactor)Transmatrix(1,1)=CDbl(Txtscalefactor)Transmatrix(2,2)=CDbl(Txtscalefactor)Transmatrix(3,0)=CDbl(1-Txtscalefactor)*Centerpoint(0)Transmatrix(3,1)=CDbl(1-Txtscalefactor)*Centerpoint(1)Transmatrix(3,2)=CDbl(1-Txtscalefactor)*Centerpoint(2)With ThisDrawing.ModelSpace.Item(.Count-1).TransformBy(Transmatrix).Item(.Count-1).color=acBlue.Item(.Count-1).Update End With Unload Me,