乐筑天下

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

在同一图形中复制块

[复制链接]

16

主题

48

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
112
发表于 2015-6-30 13:39:45 | 显示全部楼层 |阅读模式
您好,
我正在尝试复制在side数据库中打开的图形中的特定块,并将其以相等的距离粘贴n次。这是我的代码:
  1. try
  2.             {
  3.                 using (db)
  4.                 {
  5.                     db.ReadDwgFile(@"-------.dwg", FileOpenMode.OpenForReadAndAllShare, false, null);
  6.                     db.CloseInput(true);
  7.                     using (Transaction tr = db.TransactionManager.StartTransaction())
  8.                     {
  9.                         BlockReference br;
  10.                         BlockTableRecord btr = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead);
  11.                         foreach (ObjectId id in btr)
  12.                         {
  13.                             Entity ent = (Entity)tr.GetObject(id, OpenMode.ForWrite);
  14.                             if (ent is Line)
  15.                             {
  16.                                 Line line = (Line)ent;
  17.                                 if (line.Handle.ToString() == "3D5")
  18.                                 {
  19.                                     Point3d linePt = new Point3d();
  20.                                     linePt = line.StartPoint;
  21.                                     ed.WriteMessage(linePt.ToString());
  22.                                     
  23.                                     ObjectId brId = ObjectId.Null;
  24.                                     string blockFile = @"--------.dwg";
  25.                                     string blockName = Path.GetFileNameWithoutExtension(blockFile);
  26.                                     
  27.                                     using (Database tempDb =  new Database(false, true))
  28.                                     {
  29.                                         tempDb.ReadDwgFile(blockFile, FileShare.Read, true, null);
  30.                                         brId = db.Insert(blockName, tempDb, false);
  31.                                         tempDb.Dispose();
  32.                                      br = new BlockReference(linePt, brId);
  33.                                         //tr.AddNewlyCreatedDBObject(br, true);
  34.                                     }
  35.                                 }
  36.                             }
  37.                         }
  38.                         tr.Commit();
  39.                     }
  40.                     db.SaveAs(@"----------.dwg", DwgVersion.Current);
  41.                 }
  42.             }
  43.             catch (Autodesk.AutoCAD.Runtime.Exception ex)
  44.             {
  45.                 ed.WriteMessage(ex.ToString());
  46.             }

不幸的是,它不起作用。请帮忙。
谢谢

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

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

使用道具 举报

24

主题

204

帖子

6

银币

后起之秀

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

铜币
300
发表于 2015-7-1 07:31:33 | 显示全部楼层
您必须将新的块引用添加到模型空间。
回复

使用道具 举报

16

主题

48

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
112
发表于 2015-7-3 00:17:15 | 显示全部楼层
谢谢你的回复,我现在有了新的代码,这就是它,它将新的块引用添加到数据库中。   使用(Database db = new Database(false,true))。
{。
dbReadDwgFile(@" - y.dwg ",FileOpenMode。OpenForReadAndAllShare,false,null);。
dbCloseInput(真);。

使用(事务tr = db,transaction manager . start transaction())。
{。
块表bt =(块表)tr,GetObject(db,BlockTableId,OpenMode。for read);。

BlockTableRecord Bt rec =(block tablerecord)tr,GetObject(bt[BlockTableRecord,模型空间],开放模式。for read);。

foreach(btrec中的ObjectId id)。
{。
实体ent =(实体)tr,GetObject(id,OpenMode。for read);。

if (ent是BlockReference)。
{。
block reference bref =(block reference)trGetObject(ent,ObjectId,OpenMode。for read);。

if (bref,Name == "XYZ")。
{。

btrec,append entity(bref);。
trAddNewlyCreatedDBObject(bref,true);。
}。
dbtransaction manager . QueueForGraphicsFlush();。
}。
}。

trcommit();。
}。
db1,另存为(@"1.dwg ",DwgVersion。当前);。
}。
}。
catch(系统,例外情况,例如)。
{。
消息框,显示(例如,ToString());。
}。
我得到的错误是eAlreadyInDb,请帮帮忙,谢谢编辑:kdub -> code=csharp。
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2015-7-3 02:35:37 | 显示全部楼层
您好,
您必须创建找到的块参照(已在数据库中)的副本,并将该副本添加到数据库中
在这里看一看。
回复

使用道具 举报

16

主题

48

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
112
发表于 2015-7-3 04:13:39 | 显示全部楼层
您提供的链接仅适用于实体。但我正在寻找块引用,其中我必须考虑插入点和名称。
谢谢
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2015-7-3 07:56:41 | 显示全部楼层

您是否对块引用(即实体)尝试过这种方式?如果是的话,你能提供你的测试代码吗?
回复

使用道具 举报

16

主题

48

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
112
发表于 2015-7-4 02:16:20 | 显示全部楼层

  1. Entity ent = (Entity)tr.GetObject(id, OpenMode.ForRead);
  2.                             if (ent is BlockReference)
  3.                             {
  4.                                 BlockReference bref = (BlockReference)tr.GetObject(ent.ObjectId, OpenMode.ForRead);

这是你的意思吗?它在上面的代码中。
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2015-7-4 04:51:38 | 显示全部楼层
尝试下面的CopyBlock()方法,它使用我提供的链接中显示的克隆过程,它需要3个参数:要复制的一些块引用应该插入并必须复制的数据库,这可以是一个辅助数据库或活动文档数据库(这使测试更容易);。
要搜索和复制的块的名称;。
要应用于复制的块重复引用的转换矩阵(Matrix3d实例)     private void copy block(Database db,string blockName,Matrix3d xform)。
{。
使用(事务tr = db,transaction manager . start transaction())。
{。
块表记录模型空间=(块表记录)tr,GetObject(。
符号实用服务,GetBlockModelSpaceId(db),OpenMode。for write);。
rx class blockRefClass = rx class,GetClass(type of(block reference));。
List  clones = new List ();。
foreach(模型空间中的ObjectId id)。
{。
如果(id,object class = = blockRefClass)。
{。
块引用br =(块引用)tr,GetObject(id,OpenMode。for read);。
如果(br,Name == blockName)。
{。
克隆人,Add((BlockReference)br,clone());。
}。
}。
}。
foreach(克隆中的块引用克隆)。
{。
克隆,transform by(xform);。
模型空间,AppendEntity(克隆);。
trAddNewlyCreatedDBObject(clone,true);。
}。
trcommit();。
}。
}调用示例(复制“XYZ”引用并将它们沿X轴移动15个单位):   数据库db = HostApplicationServices,工作数据库;。
Matrix3d xform = Matrix3d,位移(新Vector3d(15.0,00.0,0.0));。
CopyBlock(db,“XYZ”,xform);。
回复

使用道具 举报

16

主题

48

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
112
发表于 2015-7-4 05:29:01 | 显示全部楼层
太棒了!!这正是我想要的。非常感谢!!你救了我的命。
我还想在第二次添加时在块上附加一行。我会努力并分享代码。
谢谢
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-5 00:56 , Processed in 0.156413 second(s), 70 queries .

© 2020-2025 乐筑天下

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