gpt4 book ai didi

c# - 如何设置常量属性AttributeReference?

转载 作者:太空宇宙 更新时间:2023-11-03 23:31:01 26 4
gpt4 key购买 nike

是否可以更改 AttributeReference 的 Constant 属性?(属性 IsConstant 是只读的)

最佳答案

我不知道 objectarx,但在 .Net 中(因为你说的是​​ c#),试试这个:

        Database currentDB = Application.DocumentManager.MdiActiveDocument.Database;
using (Transaction transaction = currentDB.TransactionManager.StartTransaction())
{
BlockTable blockTable = (BlockTable)transaction.GetObject(currentDB.BlockTableId, OpenMode.ForRead);

//Create the block if it doesn't exist
if (!blockTable.Has("MyBlock"))
{
using (BlockTableRecord myBlock = new BlockTableRecord())
{
myBlock.Name = "MyBlock";
myBlock.Origin = Point3d.Origin;

//You can add geometry here, but I'm just going to create the attribute
using (AttributeDefinition attribute = new AttributeDefinition())
{
attribute.Position = Point3d.Origin;
attribute.Tag = "Constant";
attribute.Prompt = "Enter value: ";
attribute.TextString = "My value";
attribute.Height = 0.5;
attribute.Justify = AttachmentPoint.BottomLeft;
attribute.Constant = true;

myBlock.AppendEntity(attribute);

//add to the block table
blockTable.UpgradeOpen();
blockTable.Add(myBlock);
transaction.AddNewlyCreatedDBObject(myBlock, true);

}

}

transaction.Commit();
}
}

编辑:我刚刚意识到您还说了 AttributeReference 而不是 AttributeDefinition。在不确定验证的情况下,我认为不能直接修改引用,因为该值是常量。因此,您必须在 BlockTableRecord 中更新 block 的定义,一旦获得它,基本过程相同。

更新代码如下:

       Database currentDB = Application.DocumentManager.MdiActiveDocument.Database;
using (Transaction transaction = currentDB.TransactionManager.StartTransaction())
{
BlockTable blockTable = (BlockTable)transaction.GetObject(currentDB.BlockTableId, OpenMode.ForRead);


//Create the block if it doesn't exist
if (blockTable.Has("MyBlock"))
{
//Get the block
ObjectId myBlockID = blockTable["MyBlock"];
BlockTableRecord myBlock = (BlockTableRecord)transaction.GetObject(myBlockID, OpenMode.ForRead);

//iterate through objects and update the attribute definition
if (myBlock.HasAttributeDefinitions)
{
foreach (ObjectId oid in myBlock)
{
DBObject dbObject = transaction.GetObject(oid, OpenMode.ForRead);
if (dbObject is AttributeDefinition)
{
AttributeDefinition attribute = (AttributeDefinition)dbObject;

attribute.UpgradeOpen();

attribute.TextString = "NewValue";
attribute.Constant = true;
}
}
}

//Remember... BlockRerefences are glorified pointers to the BlockTableRecord that defines them
//so let's get all block references associated to it and update them

foreach (ObjectId oid in myBlock.GetBlockReferenceIds(false, true))
{
BlockReference blockReference = (BlockReference)transaction.GetObject(oid, OpenMode.ForWrite);
blockReference.RecordGraphicsModified(true);
}

transaction.Commit();
}
}

关于c# - 如何设置常量属性AttributeReference?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32199957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com