二次开发教程_第1页
二次开发教程_第2页
二次开发教程_第3页
二次开发教程_第4页
二次开发教程_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

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

文档简介

第二篇AutoCADNET1章:AutoCADNET第二篇AutoCADNET1章:AutoCADNETAPI了解.NET框架。AutoCAD.NETAPI概我们在前一篇详细讲解了AutoCAD的开发工具-ObjectARX,毫无疑问以VC++为基础的ObjectARX的开发功能是非常强大的,但是掌握VC++及VisualLisp等虽然方便易学,开发周期也比较短,但是,对执行速度和性能要求都很高的解决方案或者复杂的程序,VBA和VisualLisp就难以胜任了。外包类(ManagedWrapperClass,使开发人员可在.NET框架下,使用任何支外包类(ManagedWrapperClass,使开发人员可在.NET框架下,使用任何支AutoCAD2008NETAPIC++相匹.NET.NETMicrosoft面向XMLWeb服务的平台,它允许应用程序通过.NET框架是NET的最为重要的组件,它是一个可以构造、发布以及运行Web服务的开发环境。从概念上讲,.NET框架平台代表了一种崭新的软件开发.NET框架平台包含两个方面的核心内容:一个是运行时引擎(Runtime1-1NET1-1NETDimNameAsString="Hello"VisualBasic中,以是VB.NET访问 EndTry1-2NET1-2NET1.3程序集和1-31-3户处理AutoCAD程序级别的对象,如程序对象、文档对象等。中的类,就需要使用AutoCAD的命名空间。员时无需重复该名字空间的名字,C#usingusingusingusing 创建 创建使用.NETAPI对AutoCAD进行开发需要MicrosoftVisualStudio2005集成开MicrosoftVisualC#2005ExpressEdition(IDE)C#VisualC#2005ExpressEdition已经通过Web下载(/express)免费提供。 1-520081-52008\AutoCADApplicationServices,EditorInput和Runtime命名空间:5)AutoCAD中被调用,需要在工程中添加定制的个属性由Runtime命名空间提供,在类Class1中添加下列属性和函数。例如: usingusingAutodesk.AutoCAD.EditorInput;5)在命令的执行部分,我们要在5)在命令的执行部分,我们要在命令行中输出信息,可以通过Editor对象实现,Editor类拥有访问AutoCAD命令行的相关方法,它还包括选择对象和其它一 Editored= 程序的加载和AutoCAD程序,默认路径为C:\ProgramFiles\AutoCAD2008\acad.exepublicvoidHelloNet(){ed.WriteMessage("使用NET开发AutoCAD程序");}publicvoidHelloNet{}.1.6练AutoCAD的托管程序集为两个文件: .1.6练AutoCAD的托管程序集为两个文件: 第22.1用户交第22.1用户交互概环境中选择所需要的点或实体对象,在ObjectARX中是通过一些列专有的全局Autodesk.AutoCAD.EditorInputEditor类,该类提Autodesk.AutoCAD.EditorInputEditor类,该类提Autodesk.AutoCAD.EditorInput命名空间。使用Editor类的GetXXX函数获取用户输入的时候,需要传入入结果保存在PromptResult或者其派生类对象中,如PromptDoubleResult,、首先要获取当前激活文档Editor对象 ed= PromptIntegerOptionspublicvoidGetData(){ PromptIntegerOptionsintOp=newPromptIntegerResultintRes;if(intRes.Status==PromptStatus.OK)//正常输{intnSides=PromptIntegerResultValue属性获取用户所输入的PromptIntegerResultValue属性获取用户所输入的数据不再介绍,需要说明的是通过GetString获取字符时,返回的结果保存在要求用户获取屏幕坐标点需要通过Editor类的GetPoint方法,在PromptPointOptions对象中设置提示字符串和其它的一些提示控制选项,将该类的staticpublicvoidPickPoint(){ (=={ed.WriteMessage("用户按了取消ESC键/n"}}中可PromptXXXOptionsAllowYYY属性来实现,其中这里的中可PromptXXXOptionsAllowYYY属性来实现,其中这里的booltruefalse即可,2-2PromptXXXOptions类的限定属 Autodesk.AutoCAD.Geometry.Point3d(0,0,0);resPt={ed.WriteMessage("选择的点为: }}不同的PromptXXXOptions类可能具有不同的AllowYYY属性,在使用2.2选择集处Editor类提供了许多用于操作选择对象的方法,如表2-3所示。2-3PromptSelectionResult不同的PromptXXXOptions类可能具有不同的AllowYYY属性,在使用2.2选择集处Editor类提供了许多用于操作选择对象的方法,如表2-3所示。2-3PromptSelectionResult.SelectionSet类的例,通SelectionSet类的GetObjectIds()方法返回所有选中实体的对象ID的集合,ID就可以对实体进行操作,在后面的章节会加以介绍,本章只介绍选择以GetSelection()为例说明对象选择集的创建方法staticpublicvoidSelectEnt(){SelectionFilterSelectionFilter对象实例的时候需要一个TypedValue的数组。SelectionFilterSelectionFilter对象实例的时候需要一个TypedValue的数组。属性是一个16位整型数据,它指明TypedValue.Value属性的数据类型,而如果只选择当前的块定义,可以用下面的代码来创建过滤器 SelectionFilterfilter=newSelectionFilter(filList); {intnCount=SS.Count;ed.WriteMessage("选择了{0}个实体 ,}}2.3练 2.3练 { // ed.GetSelection(selectionOp,filter);{intnCount=SS.Count;ed.WriteMessage("选择了{0}个块 ,}}((所有PromptXXXOptions类都具有相同的AllowYYY属性,其中((所有PromptXXXOptions类都具有相同的AllowYYY属性,其中()TypedValue.TypeCode属性是一个323AutoCAD数据库架构AutoCADAutoCADAutodesk.AutoCAD.DatabaseServices命名空间,AutoCADDatabase类表示,可以通过以下语句获 Databasedb= 命名对象词典主要包含四类词典:组词典(ACAD_GROUP),MLINE线型词典记录保存在层表中,实体必须保存在块表记录中,从中我们不难看出数据库3-1AutoCAD数据库的构事务介绍3-1AutoCAD数据库的构事务介绍StartTransactionCommit()方法结束需要通过Dispose方法显式地释放。Databasedb=3-1 OpenMode.ForRead)asBlockTable;3-1 OpenMode.ForRead)asBlockTable; {//}catch(Autodesk.AutoCAD.Runtime.Exception{}{//}的ObjectId,对象ID仅存在于其所在的数据库从内存的ObjectId,对象ID仅存在于其所在的数据库从内存中产生到数据库被删除之间并且如果操作多个数据库,对象ID在多个数据库之间都是唯一的每种符号表只能存储指定类型的记录,例如,层表LayerTable只能保存层表记录(arab文字样式表(TextStyleTable)a(iabl(Cabl(prabataItem–用于从指定的符号表中通过字符关键字获取layerId= trans.AddNewlyCreatedDBObject(layerTblRecord, publicvoidCreateLayer(){Databasedb trans.AddNewlyCreatedDBObject(layerTblRecord, publicvoidCreateLayer(){Databasedb= {//NewLayer层是否if{layerId=}{//NewLayer layerTblRecord.Name="NewLayer";//layerId=layerTbl.Add(layerTblRecord);}练(1)在AutoCAD中使用block命令定义的块 练(1)在AutoCAD中使用block命令定义的块 ((}catch(Autodesk.AutoCAD.Runtime.Exception{}{//}}第4第4实体实体,BlockTableRecordAppendEntityBlockTableRecordbtr=//BlockTableRecordbtr=publicvoidCreateCircle(){Databasedb=//使用"using",结束是自动调用事务的 { (BlockTable)(trans.GetObject(db.BlockTableId,OpenMode.ForRead)); Point3dcenter=newPoint3d(10,10,0);circle.ColorIndex=1;}}4.2对象标DWG文件中的每一个实体都有一个唯一的标识符,称为句柄,用4.2对象标DWG文件中的每一个实体都有一个唯一的标识符,称为句柄,用的publicvoidOpenEnt(){ PromptEntityOptionsentOps=newPromptEntityOptions("PromptEntityResultentRes;{}4.3类型识Entity派生的,所以当打开一个实体对象时,经常需要判断其类4.3类型识Entity派生的,所以当打开一个实体对象时,经常需要判断其类 转换操作;但是,如果转换不可行,asnullif(entisif(entisObjectIdobjId=Databasedb=HostApplicationServices.WorkingDatabase; {Entityent=trans.GetObject(objId,asEntity}ed.WriteMessage("修改实体的颜色}4.4实体属()0~256的颜色4.4实体属()0~256的颜色色如表4-1:4-11Red(红2Yellow(黄3Green(绿4Cyan(青5Blue(蓝if(entis{aLine.ColorIndex=1;}{cir.ColorIndex=2;}4-2AutoCADLinetypeTableRecord来4-2AutoCADLinetypeTableRecord来示 //OpenMode.ForRead)asLinetypeTable;确保DOTOpenMode.ForRead)asLinetypeTableRecord;0(BYBLOK2(BYLYE2(0~2566Magenta(紫红7WhiteorBlack(白采用数据库的当前线型值,此值存在CELTYPE系统变量中。4.5块定义采用数据库的当前线型值,此值存在CELTYPE系统变量中。4.5块定义和两部分。块定义就是在块表中的一条块表记录BlockTableRecord,我们使用//OpenMode.ForRead)asLinetypeTable;确保DOTOpenMode.ForRead)asLinetypeTableRecord;//{//定义函数的返回值ObjectId{//定义函数的返回值ObjectIdDatabasedb=// { (BlockTable)trans.GetObject(db.BlockTableId,OpenMode.ForWrite);if{过块名获取块对应的ObjectId}{Circlecircle=newCircle(center,MTexttext=newMText();text.Location=center;text.ColorIndex=2;{{ PromptPointResultptRes;Point3dptInsert; newBtr.Origin=center;blkObjId=bt.Add(newBtr);//返回块对应//通知事务新创建了对象trans.AddNewlyCreatedDBObject(text,true);}}return}{}{ptInsert{}{ptInsert=newPoint3d(0,0,}Databasedb="using" { (BlockTable)(trans.GetObject(db.BlockTableId,OpenMode.ForWrite)); =//通知事务新创建了对象trans.Commit();//提交事务}}4.6练可 运算符用来判断是否是所指4.6练可 运算符用来判断是否是所指定的对象类型,使 if(entis {aLine.ColorIndex=1;} {cir.ColorIndex=2;}(第5了解结果缓冲ResultBuffer。(XData第5了解结果缓冲ResultBuffer。(XData5.1ResultBuffer对象时需要提供一个数据对,每个数据对包含一个数据类型描述和Autodesk.AutoCAD.DatabaseServices.TypedValue类的实例。TypeCodeResultBuffer实例的使用范围,例如,适用于扩展记录定义的TypeCode值就不适合于XData。Autodesk.AutoCAD.DatabaseServices.DxfCode枚举类型定义的码值描述了ResultBuffer可能的数据类型。TypeCodeResultBuffer实例的使用范围,例如,适用于扩展记录定义的TypeCode值就不适合于XData。Autodesk.AutoCAD.DatabaseServices.DxfCode枚举类型定义的码值描述了ResultBuffer可能的数据类型。ValueTypeCode指明的类型。ResultBufferTypedValue数组来创建一个ResultBufferResultBuffer(XDataDBObjectXData属性获取或设置扩展数据。每一组均以一个互不相同的注册应用程序名开头,扩展数据XData所支持的不同组码对应不同类型的信息,各个组码的说明如表5-1所示:DXF组码resBuf.Add(newTypedValue((int)DxfCode.Real,20.0));resBuf.Add(newTypedValue((int)DxfCode.Int32,5)); resBufnewResultBuffer(newTypedValue((int)DxfCode.Text,"开发部门))asRegAppTable;if{appTblRcd.Name="MyAppName";}{Editored=PromptEntityOptions{Editored=PromptEntityOptionsentOps=newPromptEntityOptions("选择PromptEntityResultentRes;if(entRes.Status!={}ObjectIdobjId=using(Transactiontrans={OpenMode.ForWrite)asRegAppTable;if{appTblRcd.Name="MyAppName";}历器IEnumerator(在历器IEnumerator(在System.Collections命名空间中),开发者需要借助遍历器{Editored=PromptEntityOptionsentOps=newPromptEntityOptions("选择if(entRes.Status!=PromptStatus.OK){ed.WriteMessage("选择对象失败,退出ResultBufferresBuf=newResultBuffer();//newresBuf.Add(newTypedValue(1001,"MyAppName"));//注名resBuf.Add(newTypedValue(1000工程部"));//部门resBuf.Add(newTypedValue(1040,2000.0));//薪水ent.XData=resBuf;}}记住扩展数据(XData)可以很方便的添记住扩展数据(XData)可以很方便的添加用户自定义的数据,这对于轻量5.2词AutoCAD中的词典是一般的容器对象,用于存储非图形对象派生自}Databasedb=using(Transactiontr={Entityent=if(rb!=null){while(iter.MoveNext()){}}}}1~31~369表组值10386090140170210NOD.SetAt("myDictionary",newDdic);DDictioary{using(Transactiontrans={DBDictionary; mgrXRec.Data=DBDictionaryNODDBDictionary;DBDictionaryNODDBDictionary;{//copyrightDict=}{//在NOD下创建COPYRIGHT词典copyrightDict=newDBDictionary();NOD.SetAt("COPYRIGHTcopyrightDict);}//copyrightDict"author"{authorDict=}{authorDict=new"{Editored={Editored=using(Transactiontrans={//copyrightDict.SetAt("Author",authorDict);}{authorRec=}{authorRec=newXrecord();TypedValue((int)DxfCode.Text,authorDict.SetAt("AuthorInfo",authorRec);}}}的扩展词典DBDictionary的ObjectId,借助这个ObjectId通过事务可以将DBDictionary对象打开,并编辑词典中的扩展数据。{Editored=ed.WriteMessage("创建对象扩展词典DBDictionaryNOD=//COPYRIGHTDBDictionarycopyrightDict=//AuthorDBDictionaryAuthorDict=XrecordauthorXRec=(Xrecord)trans.GetObject(AuthorDict.GetAt("AuthorInfo"),ResultBufferresBuf=authorXRec.Data;TypedValueval=resBuf.AsArray()[0];}}PromptEntityOptionsentOps=newPromptEntityOptions("选择PromptEntityOptionsentOps=newPromptEntityOptions("选择if(entRes.Status!=PromptStatus.OK){}Databasedb={OpenMode.ForWrite)asDBObject;BlockReferenceblkRef;{blkRef=objas}{}//创建对象的扩展词典DBDictionaryextensionDict=//XrecordxRec=new{Editored=ed.WriteMessage("获取对象扩展词典信息PromptEntityOptionsentOps=newPromptEntityOptions("选择if(entRes.Status!=PromptStatus.OK){}Databasedb=xRec.Data=newnewTypedValue((int)DxfCode.Real,1200.0),//薪水newTypedValue((int)DxfCode.Text,"技术部"));//部门//在扩展词典中添加扩展记录trans.AddNewlyCreatedDBObject(xRec,true);}}{{OpenMode.ForWrite)asDBObject;BlockReferenceblkRef;{blkRef=objas}{}DBDictionaryextensionDict=XrecordEmpXRec=ResultBufferresBuf=EmpXRec.Data;TypedValueval=resBuf.AsArray()[0];val=resBuf.AsArray()[1];val=resBuf.AsArray()[2];}}5.3练()命名对象字典就是所有字典的根目录,可以通过数据库的NamedObjectsDictionaryId属性通过事5.3练()命名对象字典就是所有字典的根目录,可以通过数据库的NamedObjectsDictionaryId属性通过事务获(()每个对象都可以有一个扩展字典,扩展字典可以容纳任意的DBObject对象,包括实6用户通过APIAutoCAD6用户通过APIAutoCAD空间中包含了AutoCAD中的特性对话框,利用系统提供的界面类可以开发与加载程序时候进行CommandClass来实现,所有的托管程序都可以使用这些特性,但是,它们的优当AutoCAD加载程序时,它会查询程序的程序集(assembly)是否有ExtensionApplication自定义特性,如果它找到这个特性,AutoCAD会把 ExtensionApplication特性所关联的类型作为程序的入口点,如果没有找到ExtensionApplication特性,AutoCADIExtensionApplication接口的ExtensionApplication特性所关联的类型作为程序的入口点,如果没有找到ExtensionApplication特性,AutoCADIExtensionApplication接口的IExtensionApplication接口的实现,AutoCAD还查询程序的程序集CommandClassCommandClass特性的实IExtensionApplicationCommandClassAutoCAD了Initialize()和Terminate()方法,因为托管程序不能被自动卸载,所以TerminateAutoCAD退出时才被调用。如果你不需要执行初始化或终止{publicclass{{}{}} ExtensionApplication ExtensionApplication 6.2自定义上下文上下文菜单,也叫快捷菜单,AutoCAD.NETAPI本身提供了一套处理上下Autodesk.AutoCAD.Windows命名空间有一个名为ContextMenuExtension的类,该类负责上下文菜单中添加定制的菜单项,而原菜ContextMenuExtension中包含菜单项,所包含的菜单项用Autodesk.AutoCAD.Windows.MenuItemClick事件来指{using(DocumentLockdocLock={创建完菜单项后,调ContextMenuExtensionMenuItems属性Add创建完菜单项后,调ContextMenuExtensionMenuItems属性Add法将菜单项添加到的ContextMenuExtension对象实例中,最后通过调用类的AddDefaultContextMenuExtension()方法将创建的自定义上下文菜单添加到系{m_ContextMenu.Title="我的自定义菜单";Autodesk.AutoCAD.Windows.MenuItemmi;=Databasedb={OpenMode.ForRead)asBlockTable;BlockTableRecordbtr=Circlecir=newCircle(newPoint3d(10,10,0),Vector3d.ZAxis,100): =1;trans.Commit();}}}通过调 类自定义上下文菜单的加载和删除可以分别在IExtensionApplication通过调 类自定义上下文菜单的加载和删除可以分别在IExtensionApplicationInitialize()和Terminate()实现函数中完成,这样可以在程序初始化过程中加{}{}{{}}mi.Click+=MyMenuItem_OnClick;}类的()6.3有模式窗要通过AutoCADNETAPI中实现自定义的窗体,可以直接对.NETSystem.Windows.Forms中的类进行扩展,Form.ShowDialog方法来显类的()6.3有模式窗要通过AutoCADNETAPI中实现自定义的窗体,可以直接对.NETSystem.Windows.Forms中的类进行扩展,Form.ShowDialog方法来显示对话框,而是应该调用Autodesk.AutoCAD.ApplicationServices.Application类的ShowModalDialog方法来ShowModelessDialog方法来显示自定义的无模式AutoCADForm.ShowDialog可能会导致不可预知行界面布局设计MyModalForm中我们通过按钮实现从当前绘图环境中6-1{Databasedb=on(Circle.GetClass(typeof(Circle)),m_ContextMenu);Editored={Editored={{ if(prEntRes.Status!=PromptStatus.OK)thrownewSystem.Exception("错误或用户取消ObjectIdid=Circlecir;if(objis{cir=objas}{thrownewSystem.Exception("选择对象错误}tb_layer.Text=cir.Layer;tb_center.Text=cir.Center.ToString();}}{6.4自定义工具面板和无模6.4自定义工具面板和无模式Autodesk.AutoCAD.Windows命名空间中的类除了提供线型和颜色之类的面板及面板集和状态栏等Autodesk.AutoCAD.Windows.PaletteSet可以要基于UserControl类创建自定义的控件,假定自定义的控件名称为ModelessForm,那么以下代码就创建一个面板{Editored={if(palSet==publicvoidShowModalForm(){}}{}}{//palSet.Style=PaletteSetStyles.ShowTabForSingle;palSet.Style=PaletteSetStyles.NameEditable;palSet.Style=PaletteSetStyles.ShowCloseButton;palSet.Opacity=90;palSet.MinimumSize=newSystem.Drawing.Size(300,300);palSet.Add("我的页面",myPageCtrl);}}{ed.WriteMessage("创建面板集错误}}6-2当用户在自定义面板中直接拖动“拖拽创建”命令将执行拖拽操作,要通过NETI6-2当用户在自定义面板中直接拖动“拖拽创建”命令将执行拖拽操作,要通过NETIs.tD.oDratrp{{ditored={而在自定义控件ModelessForm类中,需要添加而在自定义控件ModelessForm类中,需要添加“拖拽创建”标签控件(名{{//System.Windows.Forms.DragDropEffects.All,newMyDropTarget());}using(DocumentLockdocLock={Convert.ToDouble(ctrl.tb_Salary.Text),pt);}}{ed.WriteMessage("失败}}} 6.5选项对话框DisplayingOptionDialog的处理函数,传入到回调函数中的第二个参数是一个6-3{}AutoCADAutoCADApplicationprivatestaticvoidTabHandler(objectsender,{}{}{}{}MyOptionPage实例和一个TabbedDialogActionMyOptionPage实例和一个TabbedDialogAction中,我们使用的是OK。Class1static成员中,如下代码:AutoCAD的选项对话框(可以通过“op”6.6练 (objectsender,{ TabbedDialogExtensiontabbedDialog=newpublicvoid{ =tb_Author.Text; }{ TabbedDialogExtensiontabbedDialog=new}e. ("我的属性页}(e. ("我的属性页}((7AutoCAD中的事AutoCAD7AutoCAD中的事AutoCAD事件C#中委托委托C#中的一种引用类型,类似于C/C++中的函数指针,与函数指针不同的AutoCAD事件上面第一个参数的类型为Object,它引用引发事件的实例,第二个参数从EventArgs类型派生,它保存事件数据。如果事件不生成事件数据,则第二个参上面第一个参数的类型为Object,它引用引发事件的实例,第二个参数从EventArgs类型派生,它保存事件数据。如果事件不生成事件数据,则第二个参数只是EventArgs的一个实例。否则,第二个参数为从EventArgs派生的自定(+=)来为事件附加事件处理程序。在下面的示例中,publisherRaiseCustomEvent的事件。请注意,订 {//执行指定操作}publicdelegatevoidEventHandler(Objectse

温馨提示

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

评论

0/150

提交评论