乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 63|回复: 4

擦除块并替换它们

[复制链接]

50

主题

114

帖子

2

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
314
发表于 2016-2-17 13:19:06 | 显示全部楼层 |阅读模式
嗨,我有一个包含许多不同块的绘图。我想将它们替换为所有相同的块,我正在做的是删除它们并在它们原来的位置插入一个新块。如果我正在替换的所有块都有不同的名称,它运行良好,但如果不是,则某些块不会被替换。我知道我的代码需要修复,但我不知道如何修复。try/catch是我尝试修复代码时的一种解决方法,私有无效bbtnChangeBLK_Click(对象发送者,EventArgs e)。
{。
文档文档=Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;。
数据库db=doc.Database;。
编辑AcadApp.DocumentManager.MdiActiveDocument.Editor。

使用(DocumentLock lockDoc=doc.LockDocument())。
{。
//Trouver tous les Block s et ene reàcôtéle nom et la visibilité。
使用(事务tr=db.TransactionManager.StartTransaction())。
{。
TypeValue[]filList=new TypeValue[1]{new TypeValue((int)DxfCode.Start,"INSERT") };。
SelectionFilter filter=new SelectionFilter(filList);。
PromptSelectionOptions opts=new PromptSelectionOptions();。
opts.MessageForAdding="选择块引用:";。
PromptSelectionResult res=ed.GetSelection(opts, filter);。

//如果选择不成功,则不执行任何操作。
if(res.Status!=PromptStatus.OK){返回;}。

SelectionSet selSet=res.Value;。

ObjectId[]idArray=selSet.GetObjectIds();。

foreach(idArray中的ObjectId blkId)。
{。
块参考blkRef=(块参考)tr.GetObject(blkId,OpenMode.ForWrite);。
字符串cNomBlk = "";。
尝试。
{。
cNomBlk=blkRef.Name.ToUpper();。
}。
捕捉。
{。
继续;。
}。
Point3d ptLoc=blkRef.Position;。
字符串cLayer=blkRef.Layer;。
双n旋转=blkRef.Rotation;。
Scale3d sc3d=blkRef.ScaleFactors;。

BlockTableRecord btr=(BlockTableRecords)tr.GetObject(blkRef.BlockTableRecord,OpenMode.ForWrite);。
blkRef.Erase();。
btr.Erase();。

如果(cNomBlk.StartsWith("ARP172"))。
{。
UTIL.insertBlock(ptLoc,"ARBUSTE", sc3D. X, nRotation, cLayer, false);。
}。
}。
tr.Commit();。
}。
}。
}。


本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2016-2-17 14:48:22 | 显示全部楼层
嗨,
有几点需要考虑;
* 不需要创建选择集和ObjectID的数组,因此只需在foreach函数中用res.value.GetObjctIds()替换它即可
* 我认为您的try块没有用,因为它没有覆盖代码主要目标所需的任务,所以必须进行修改。
* 您没有排除属性块,因为您没有考虑它们,这不是一件简单的事情,必须需要大量的代码才能获得所有的出现。
* 动态块名称也非常重要,因为不能从简单属性中检索它们的源名称。Name
这是我在阅读您的代码时想到的,所以祝您编码好运。
回复

使用道具 举报

50

主题

114

帖子

2

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
314
发表于 2016-2-17 14:58:08 | 显示全部楼层
嗨,
感谢您的评论。try/catch块是为了防止这种错误(当同名的块已经被删除时发生) :
回复

使用道具 举报

50

主题

114

帖子

2

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
314
发表于 2016-2-17 15:14:03 | 显示全部楼层
当我确定不再有BlockReference引用BlockTableRecord时,我想我需要删除它<但我还没弄明白是怎么回事。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2016-2-17 17:20:14 | 显示全部楼层
太好了,让它像你预期的那样工作对你有好处。
我刚刚更新了代码,以防止用户选择属性块,因为程序没有考虑它们,尽管我看到您对这个问题不感兴趣,所以如果有人喜欢尝试或使用,我会修改它。
要仅从右上角的组合框[ code ]发布C#代码,可以选择C#和其他一些编程语言。
祝你好运。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-4 18:53 , Processed in 0.546271 second(s), 62 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表