当前位置: 首页 > 编程语言 > C#

可以使用Autodesk.AutoCAD.Interop在AutoCAD中编辑块属性吗?

时间:2023-04-10 18:43:00 C#

是否可以使用Autodesk.AutoCAD.Interop在AutoCAD中编辑块特性?我开发了一个外部WPF应用程序来生成c#中的图。我已经能够使用Autodesk.AutoCAD.Interop来绘制、标注尺寸、添加块以及应用程序需要的所有其他内容,但我似乎无法填充标题栏或生成明细表。我看到的所有示例都基于要求应用程序作为内部AutoCAD插件运行的机制。问题是,使用ModelSpace.InsertLine插入一行需要一两行代码,而现在,它至少有8行代码!有没有办法使用Autodesk.AutoCAD.Interop实现此功能?或者有没有办法将互操作与可以从外部exe调用的插件一起使用?对此的任何指示将不胜感激。谢谢。编辑说明://之前-使用Autodesk.AutoCAD.Interop绘制直线返回线;}//现在-使用Autodesk.AutoCAD.Runtime[CommandMethod("DrawLine")]publicstaticLineDrawLine(Coordinatestart,Coordinateend){//获取当前文档和数据库//获取当前文档和数据库DocumentacDoc=Application.DocumentManager.MdiActiveDocument;数据库acCurDb=acDoc.Database;//使用(TransactionacTrans=acCurDb.TransactionManager.StartTransaction())开始事务{//打开块表以读取BlockTableacBlkTbl;acBlkTbl=acTrans.GetObject(acCurDb.BlockTableId,OpenMode.ForRead)asBlockTable;//打开Block表记录Model空间用于写入BlockTableRecordacBlkTblRec;acBlkTblRec=acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],OpenMode.ForWrite)作为Bl锁表记录;//创建一条从5,5开始到12,3结束的线LineacLine=newLine(start.Point3d,end.Point3d);acLine.SetDatabaseDefaults();//添加新对象到块表记录和事务acBlkTblRec.AppendEntity(acLine);acTrans.AddNewlyCreatedDBObject(acLine,true);//将新对象保存到数据库acTrans.Commit();返回acLine;}}是的,您绝对可以将这两种方法结合起来编写一个在AutoCAD中执行工作的进程内DLL。通过使用[CommandMethod("MethodName")]标记公共方法,使您希望调用的命令在命令行上可用。通过互操作启动或启动AutoCAD。使用互操作AcadApplication,网络加载您的DLL,然后从命令行调用辅助函数。*奖励*您还可以通过这种方式更轻松地将互操作参数传递给内部命令。下面是一个如何在进程中构建命令方法然后通过COM调用它的示例:[CommandMethod("EditBlockAtt")]varacEd=AcadApplication.DocumentManager.MdiActiveDocument.Editor;varblockNamePrompt=acEd.GetString(Environment.NewLine+"输入方块名称:");如果(blockNamePrompt.Status!=PromptStatus.OK)返回;varblockName=blockNamePrompt.StringResult;varattNamePrompt=acEd.GetString(Environment.NewLine+"输入属性名称:");如果(attNamePrompt.Status!=PromptStatus.OK)返回;varattName=attNamePrompt.StringResult;varacPo=newPromptStringOptions(Environment.NewLine+"Enternewattributevalue:"){AllowSpaces=true};varnewValuePrompt=acEd.GetString(acPo);如果(newValuePrompt.Status!=PromptStatus.OK)返回;varnewValue=newValuePrompt.StringResult;使用(varacTrans=acDb.TransactionManager.StartTransaction()){varacBlockTable=acTrans.GetObject(acDb.BlockTableId,OpenMode.ForRead)asBlockTable;如果(acBlockTable==null)返回;varacBlockTableRecord=acTrans.GetObject(acBlockTable[BlockTableRecord.ModelSpace],OpenMode.ForRead)asBlockTableRecord;如果(acBlockTableRecord==null)返回;foreach(varblkIdinacBlockTableRecord){varacBlock=acTrans.GetObject(blkId,OpenMode.ForRead)asBlockReference;如果(acBlock==null)继续;如果(!acBlock.Name.Equals(blockName,StringComparison.CurrentCultureIgnoreCase))继续;foreach(ObjectIdattIdinacBlock.AttributeCollection){varacAtt=acTrans.GetObject(attId,OpenMode.ForRead)asAttributeReference;如果(acAtt==null)继续;如果(!acAtt.Tag.Equals(attName,StringComparison.CurrentCultureIgnoreCase))继续;acAtt.UpgradeOpen();acAtt.TextString=newValue;}}acTrans.Commit();然后从互操作AcadApplication中,netloaddll并以这种格式从命令行调用方法:(命令“EditBlockAtt”“BlockName”“AttributeName”“NewValue”)但是,如果你想要纯互操作,那么在运行时有一个AcadDocument对象,可能会得到你需要的东西Something:foreach(AcadEntityentinacadDoc.ModelSpace){varblock=entasAcadBlockReference;如果(块==空)继续;{如果(!block.Name.Equals("BlockName",StringComparison.CurrentCultureIgnoreCase))继续;varatts=block.GetAttributes()asobject[];如果(atts==null)继续;foreach(atts.OfType()中的var属性}}}另请注意,这是使用AutoCAD2012Interop库Varies。以上是C#学习教程:我可以在AutoCAD中使用Autodesk.AutoCAD.Interop来编辑块属性吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: