乐筑天下

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

如何编辑插入的动态块的属性文本字符串和参数值

[复制链接]

2

主题

6

帖子

2

银币

初来乍到

Rank: 1

铜币
13
发表于 2016-7-5 13:24:47 | 显示全部楼层 |阅读模式
我可以使用VB.NET修改插入的普通块引用的属性文本字符串,但它不适用于插入的动态块。请帮我把这件事做好。

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

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

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2016-7-5 23:48:58 | 显示全部楼层
如果你把你目前得到的代码发给我们,即使它不工作,你也更有可能得到回应。
我们喜欢在这里阅读代码。
回复

使用道具 举报

2

主题

6

帖子

2

银币

初来乍到

Rank: 1

铜币
13
发表于 2016-7-6 08:32:54 | 显示全部楼层

  1.     Public Sub UpdateAtt(ByVal tr As Transaction, ByVal objID As ObjectId)        
  2.             Dim br As BlockReference = DirectCast(tr.GetObject(objID, OpenMode.ForWrite), BlockReference)
  3.             Dim btr As BlockTableRecord = DirectCast(tr.GetObject(br.DynamicBlockTableRecord, OpenMode.ForWrite), BlockTableRecord)
  4.       
  5.             For Each attID As ObjectId In btr
  6.                 Dim ent As DBObject = tr.GetObject(attID, OpenMode.ForWrite)
  7.                 If TypeOf ent Is AttributeDefinition Then
  8.                     Dim AttDef As AttributeDefinition = ent
  9.                     If AttDef.Tag = "SH" Then AttDef.TextString = "111"                    
  10.                 End If            Next

如果br不是动态块,br的属性可以通过br的属性集合进行编辑,但不适用于动态块,因此我认为这项工作可以通过属性定义完成,但也不起作用,感谢阅读。。。
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2016-7-6 10:29:12 | 显示全部楼层
我不会说VB,但看起来你是在遍历块定义中的attdef,而不是block ref。以下是我用来更新块中属性的代码,请注意,我正在遍历blockref.AttributeCollection.中的属性希望这有所帮助。///。
///更新属性,。
>/// ///块引用对象ID,。
//其中键是标签的字典,文本字符串的值。
公共静态int更新属性(ObjectId block RefID,字典atts)。
{。
int updatedAtts=0;。
使用(LockedTransaction acTr=Active.Document.TransactionManager.StartLockedTransaction())。
{。
BlockRef=acTr.GetObject(block RefID,OpenMode.ForRead, true)作为BlockRef;。
如果(块Ref!=null)。
{。
foreach(KeyValuePairatt in atts)。
{。
foreach(ObjectId attId inblockRef.AttributeCollection )//。
{。
属性引用ar=acTr.GetObject(attId,OpenMode.ForRead)作为属性引用;。
如果(ar!=null&&string.Equals(ar.Tag,att.Key,StringComparison.CurrentCultureIgnoreCase))。
{。
ar.UpgradeOpen();。
ar.TextStringatt.Value。
ar.DowngradeOpen();。
updatedAtts++;。
}。
}。

}。

}。
acTr.Commit();。
}。
返回更新的属性;。
}。

回复

使用道具 举报

2

主题

6

帖子

2

银币

初来乍到

Rank: 1

铜币
13
发表于 2016-7-7 09:29:46 | 显示全部楼层
你说得对,我通过attref编辑属性textstring,但它对动态块不起作用,但很奇怪,它现在起作用了,也许我以前在代码上犯了一些错误,所以感谢Atook的帮助...非常感谢
回复

使用道具 举报

0

主题

3

帖子

1

银币

初来乍到

Rank: 1

铜币
3
发表于 2016-7-25 08:34:10 | 显示全部楼层
如何从图形中的块内删除所有文本? 我试图为此编写一个命令,它在下面,当它编译时,它不能正常运行:
  1. [CommandMethod("DELTEXT")]
  2.         public void DelText()
  3.         {
  4.             // Get the current document and database, and start a transaction
  5.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  6.             Database acCurDb = acDoc.Database;
  7.             using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  8.             {
  9.                 // Open the Block table record for read
  10.                 BlockTable acBlkTbl;
  11.                 acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,OpenMode.ForRead) as BlockTable;
  12.                 // Open the Block table record Model space for read
  13.                 BlockTableRecord acBlkTblRec;
  14.                 acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],OpenMode.ForRead) as BlockTableRecord;
  15.                 int nCnt = 0;
  16.                 acDoc.Editor.WriteMessage("\nModel space objects: ");
  17.                 // Step through each object in Model space and display the Name of the Object
  18.                 foreach (ObjectId acObjId in acBlkTblRec)
  19.                 {
  20.                     //If the ObjectClass.DxFName is INSERT, then this block is a reference.
  21.                     if (acObjId.ObjectClass.DxfName == "INSERT")
  22.                     {
  23.                         //acDoc.Editor.WriteMessage("\n" + myBlk.Name);
  24.                         //acDoc.Editor.WriteMessage("\n" + myBlk.BlockName);
  25.                         //acDoc.Editor.WriteMessage("\n" + myBlk.ObjectId.ObjectClass.DxfName);
  26.                         //acDoc.Editor.WriteMessage("\n" + myBlk.ObjectId.ObjectClass.Name);
  27.                         //Open the Block Reference
  28.                         BlockReference myBlkReference = acTrans.GetObject(acObjId, OpenMode.ForRead) as BlockReference;                    
  29.                         BlockTableRecord xRefBlkTableRecs = acTrans.GetObject(myBlkReference.BlockTableRecord,OpenMode.ForRead) as BlockTableRecord;
  30.                         
  31.                         //For each Object in the Block Table Record of the Block Reference
  32.                         foreach (ObjectId myBlkObjId in xRefBlkTableRecs)
  33.                         {
  34.                             acDoc.Editor.WriteMessage("\n Object Class Name: " + myBlkObjId.ObjectClass.Name);
  35.                             acDoc.Editor.WriteMessage("\n Object Class DxFName: " + myBlkObjId.ObjectClass.DxfName);
  36.                             //Check if the object is a text object
  37.                             if (myBlkObjId.ObjectClass.DxfName.ToString().Equals("TEXT"))
  38.                             {
  39.                                 acDoc.Editor.WriteMessage("\n This is a Text Item and Will be Deleted");
  40.                                //This is certainly a text object - count it.
  41.                                 nCnt = nCnt + 1;
  42.                                 //Delete it
  43.                                 myBlkReference.UpgradeOpen();
  44.                                 myBlkObjId.GetObject(OpenMode.ForWrite).Erase();                           
  45.                                 acTrans.Commit();
  46.                                 //acDoc.Editor.Regen();
  47.                             }
  48.                         }
  49.                     }
  50.                     else
  51.                     {
  52.                         acDoc.Editor.WriteMessage("\n" + acObjId.ObjectClass.Name.ToString());
  53.                         acDoc.Editor.WriteMessage("\n" + acObjId.ObjectClass.DxfName.ToString());
  54.                     }
  55.                     //acTrans.Commit();
  56.                     //acDoc.Editor.Regen();
  57.                 }
  58.                 acDoc.Editor.WriteMessage("\n" + nCnt + "Text Objects in Document");
  59.                 // If no objects are found then display a message
  60.                 if (nCnt == 0)
  61.                 {
  62.                     acDoc.Editor.WriteMessage("\n No Text objects found");
  63.                 }
  64.             }
  65.         }

回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2016-7-25 09:05:27 | 显示全部楼层
嗨,你应该已经开始了另一个主题。无论如何,试试这个(不需要迭代模型空间,只需迭代块表):[命令方法("DELTEXT")]。
公共无效DelText()。
{。
var doc=Application.DocumentManager.MdiActiveDocument;。
var db=doc.Database;。
var ed=doc.Editor;。
var text Class=RXObject.GetClass(typeof(DBText));。
使用(var tr=db.TransactionManager.StartTransaction())。
{。
var bt=(BlockTable)tr.GetObject(db.BlockTableId,OpenMode.ForRead);。
foreach(bt中的ObjectId btrId)。
{。
var btr=(BlockTableRecords)tr.GetObject(btrId,OpenMode.ForRead);。
如果(!(btr.IsLayout
回复

使用道具 举报

0

主题

3

帖子

1

银币

初来乍到

Rank: 1

铜币
3
发表于 2016-7-25 11:53:39 | 显示全部楼层
btr.IsFromExternalReference
回复

使用道具 举报

0

主题

3

帖子

1

银币

初来乍到

Rank: 1

铜币
3
发表于 2016-7-25 13:02:28 | 显示全部楼层
btr.IsDependent))。
{。
foreach(btr中的ObjectId id)。
{。
如果(id.ObjectClass==text Class)。
{。
var Text=(DBText)tr.GetObject(id,OpenMode.ForWrite, false, false);。
Text.Erase();。
}。
}。
}。
}。
tr.Commit();。
}。
ed.Regen();。
}。
回复

使用道具 举报

2

主题

6

帖子

2

银币

初来乍到

Rank: 1

铜币
13
发表于 2016-7-25 14:38:15 | 显示全部楼层
美丽 - 像魅力一样工作! 谢谢!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-4 16:44 , Processed in 0.228847 second(s), 72 queries .

© 2020-2025 乐筑天下

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