乐筑天下

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

克隆块引用中的实体

[复制链接]

14

主题

28

帖子

2

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
83
发表于 2021-8-22 05:43:48 | 显示全部楼层 |阅读模式
第一步,我将块引用插入到模型空间,在复制后,将手动块引用粘贴到另一个点
示例在点3d (0,0,0)中手动插入块引用
复制成为4个块引用到另一个点
问题是在运行此代码时,仅克隆块引用中的一个实体(见图片(绿色是唯一一个被克隆)
我想要克隆已选择的所有块引用(在此图片中为白色,我也想要被克隆)
这是我的代码,哪里出错了
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.IO;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Reflection;
  11. using Autodesk.AutoCAD.ApplicationServices;
  12. using acApp = Autodesk.AutoCAD.ApplicationServices.Application;
  13. using Autodesk.AutoCAD.DatabaseServices;
  14. using Autodesk.AutoCAD.Runtime;
  15. using Autodesk.AutoCAD.Geometry;
  16. using Autodesk.AutoCAD.EditorInput;
  17. using System.Windows.Forms;
  18. using System.Runtime.InteropServices;
  19. using static latihanCAD.function;
  20. namespace latihanCAD
  21. {
  22.     public class hapuslagi  
  23.     {
  24.         [CommandMethod("xx")]
  25.         public static void CreateHatchedBlock()
  26.         {
  27.             var doc = acApp.DocumentManager.MdiActiveDocument;
  28.             Database db = doc.Database;
  29.             var ed = doc.Editor;
  30.             var objCol = new DBObjectCollection();
  31.             var ListPoints = new List>();
  32.             var pso2 = new PromptSelectionOptions(); SelectionFilter sfilter = null;
  33.      
  34.             //SELECT FOR BLOCK REFERENCE
  35.             PromptSelectionResult ss2 = null;
  36.             pso2.MessageForAdding = "\nSelect Block Reference :";
  37.             sfilter = new SelectionFilter(new[] { new TypedValue(0, "INSERT") });
  38.             ss2 = ed.GetSelection(pso2, sfilter);
  39.             if (ss2.Status != PromptStatus.OK)
  40.             {
  41.                 MessageBox.Show("\nThere is not block reference to select :!");
  42.                 return;
  43.             }
  44.             using (Transaction trans = db.TransactionManager.StartTransaction())
  45.             {
  46.                 var btr = trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  47.                 foreach (ObjectId id in ss2.Value.GetObjectIds())
  48.                 {
  49.                     var ent = (Entity)id.GetObject(OpenMode.ForRead);
  50.                     var br = ent as BlockReference;
  51.                     if (ent is BlockReference)
  52.                     {
  53.                         double ky = 0.0;
  54.                         ObjectId myid = ObjectId.Null;
  55.                         Curve curve = null;
  56.                         ent.Explode(objCol);
  57.                         foreach (Object obj in objCol)
  58.                         {
  59.                             // ed.WriteMessage("\n{0}", obj.GetType());
  60.                             if (obj is Curve)
  61.                             {
  62.                                 var crv1 = obj as Curve;
  63.                                 if (crv1.Area > 0)
  64.                                 {
  65.                                     if (ky  0)
  66.                         {
  67.                             var ext1 = new Extents3d();
  68.                             var cloneCurve = curve.Clone() as Entity;
  69.                             cloneCurve.ColorIndex = 3;
  70.                             ext1 = cloneCurve.GeometricExtents;
  71.                             btr.AppendEntity(cloneCurve);
  72.                             trans.AddNewlyCreatedDBObject(cloneCurve, true);
  73.                             ed.WriteMessage("\nid clone curve " + cloneCurve.ObjectId.ToString());
  74.                             cloneCurve.Dispose();
  75.                         }
  76.                     }
  77.                 }
  78.                 ed.WriteMessage("\ncount block reference " + ss2.Value.Count.ToString());
  79.                 trans.Commit();
  80.             
  81.             }
  82.         }
  83.     }
  84. }



jtx1vukmfof.png

jtx1vukmfof.png

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

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

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2021-8-22 10:55:47 | 显示全部楼层
嗨,试着让事情尽可能简单。这是删除无用语句后的代码, [CommandMethod(“xx”)]。
公共静态 void xxCommand()。
{。

var doc = Application.DocumentManager.MdiActiveDocument;。
var db = doc.数据库;。
var ed = doc.编辑;。

选择块引用。
var pso = new PromptSelectionOptions();。
pso.消息为添加 = “\n选择块引用 :”;。
var filter = new SelectionFilter(new[] { new TypedValue(0, “INSERT”) });。
var psr = ed.GetSelection(pso, filter);。
如果 (psr.状态 != PromptStatus.OK)。
{。
Application.ShowAlertDialog(“None block reference selected !”);。
返回;。
}。
using (Transaction tr = db.TransactionManager.StartTransaction())。
{。
var btr = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;。
foreach (ObjectId id in psr.Value.GetObjectIds())。
{。
var br = (BlockReference)id.GetObject(OpenMode.ForRead);。
var objCol = new DBObjectCollection();。
br.Explode(objCol);。
foreach (DBObject obj in objCol)。
{。
if (obj is Curve curve && 0.0 。
{。
曲线,颜色索引 = 3;。
断续器追加实体(曲线);。
断续器AddNewlyCreatedDBObject(curve, true);。
}。
还。
{。
obj.处置();。
}。
}。
}。
编辑,WriteMessage(“\ncount block reference” + psr.Value.count.toString());。
断续器Commit();。
}。
}。
回复

使用道具 举报

14

主题

28

帖子

2

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
83
发表于 2021-8-22 11:57:37 | 显示全部楼层
谢谢已经回复了我的问题
,实际上我只想克隆实体在块引用
中是实体是关闭的,面积是从其他实体最大的
,你的代码所有实体如何克隆
如何更改你的代码
看到图片绿色是我想要的(实体到克隆)
我只想克隆不分解所有实体
回复

使用道具 举报

14

主题

28

帖子

2

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
83
发表于 2021-8-22 12:15:50 | 显示全部楼层
@gile非常感谢2 match,感谢您的帮助,这已经解决了
  1. [CommandMethod("xx")]
  2.         public static void xxCommand()
  3.         {
  4.             var doc = acApp.DocumentManager.MdiActiveDocument;
  5.             var db = doc.Database;
  6.             var ed = doc.Editor;
  7.             //SELECT FOR BLOCK REFERENCE
  8.             var pso = new PromptSelectionOptions();
  9.             pso.MessageForAdding = "\nSelect Block Reference :";
  10.             var filter = new SelectionFilter(new[] { new TypedValue(0, "INSERT") });
  11.             var psr = ed.GetSelection(pso, filter);
  12.             if (psr.Status != PromptStatus.OK)
  13.             {
  14.                 acApp.ShowAlertDialog("None block reference selected !");
  15.                 return;
  16.             }
  17.             using (Transaction tr = db.TransactionManager.StartTransaction())
  18.             {
  19.                 var btr = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  20.                 foreach (ObjectId id in psr.Value.GetObjectIds())
  21.                 {
  22.                     var br = (BlockReference)id.GetObject(OpenMode.ForRead);
  23.                     var objCol = new DBObjectCollection();
  24.                     br.Explode(objCol);
  25.                     objCol
  26.                         .Cast()
  27.                         .Select(p => ((Curve)tr.GetObject(p.ObjectId, OpenMode.ForRead)))
  28.                         .Where(x => x.Area > 0)
  29.                         .OrderByDescending(z => z.Area);
  30.                     var curve = objCol[0] as Curve;
  31.                     AddLayer("Layerhelper", 0, 82,false);
  32.                     curve.ColorIndex = 253;
  33.                     btr.AppendEntity(curve);
  34.                     tr.AddNewlyCreatedDBObject(curve, true);
  35.                 }
  36.                 tr.Commit();
  37.                 AddLayer("0", 0, 0, false);
  38.             }
  39.         }
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-4 01:07 , Processed in 0.157760 second(s), 63 queries .

© 2020-2025 乐筑天下

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