le mie informazioni di contatto
Posta[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
I blocchi sono un punto di conoscenza molto importante nel CAD Oggi ti fornirò alcune classificazione e introduzione dei blocchi, nonché la definizione e il riferimento dei blocchi.
Un blocco è un'entità definita da più oggetti grafici logicamente correlati. Il vantaggio è che può unificare gli standard di lavoro e migliorare l'efficienza del lavoro, perché un oggetto nella vita non è un'unità semplice, ma può essere composto da più unità. I blocchi possono ben rappresentare questa struttura.
L'essenza di un blocco è una raccolta di oggetti entità archiviati nei record della tabella dei blocchi.
I blocchi di attributi sono composti da entità costituite e informazioni aggiuntive (attributi). La definizione dei blocchi in un blocco di attributi è la stessa di quella in un blocco semplice e la definizione degli attributi viene ottenuta principalmente attraverso gli attributi e le funzioni rilevanti dell'AttributeDefinition dell'attributo. classe. . Le implementazioni specifiche includono:
Tra questi, i valori degli attributi definiti dagli attributi includono principalmente:
I blocchi dinamici ci consentono di creare blocchi con un elevato grado di flessibilità e personalizzazione. Perché una volta inserito un blocco tradizionale in un disegno, le sue dimensioni, forma e posizione vengono generalmente fisse. I blocchi dinamici, d'altro canto, possono regolare le proprie proprietà geometriche attraverso l'interazione dell'interfaccia utente (come il trascinamento delle maniglie di azione) senza dover ridefinire l'intero blocco o modificare manualmente i suoi componenti.
I blocchi sono principalmente suddivisi in blocchi semplici, blocchi di attributi e blocchi dinamici. Per i blocchi, esistono principalmente operazioni di definizione del blocco, operazioni di riferimento del blocco (ovvero operazioni di inserimento del blocco) e modifica del blocco.
Non importa che tipo di blocco siano, le loro definizioni sono più o meno le stesse (i blocchi di attributi devono aggiungere oggetti di attributo. I passaggi specifici sono i seguenti:
Il codice specifico è il seguente:
public static ObjectId AddBlockThroughDB(this Database db, string blockName, List<Entity> ents)
{
//声明ObjectId,用于返回
ObjectId entId = ObjectId.Null;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForWrite);
BlockTableRecord btr = new BlockTableRecord();
btr.Name = blockName;
for (int ii = 0; ii < ents.Count; ii++)
{
Entity ent = ents[ii];
btr.AppendEntity(ent);
}
entId = bt.Add(btr);
tr.AddNewlyCreatedDBObject(btr, true);
tr.Commit();
}
return entId;
}
Quanto sopra è solo la definizione di un blocco semplice. Per i blocchi di attributi, come suggerisce il nome, è necessario definire i campi degli attributi nel blocco (possiamo intenderlo come la definizione delle variabili degli attributi, che devono essere convertite in valori di variabili specifici). quando referenziato).
Definizione del blocco proprietà, possiamo aggiungervi proprietà aggiungendo proprietà.
/// <summary>
/// 块添加属性
/// </summary>
/// <param name="blockId"></param>
/// <param name="atts"></param>
public static void AddAttsToBlocks(this ObjectId blockId, List<AttributeDefinition> atts)
{
Database db = blockId.Database;//获取数据库对象
BlockTableRecord btr = blockId.GetObject(OpenMode.ForWrite) as BlockTableRecord;
foreach (AttributeDefinition att in atts)
{
btr.AppendEntity(att);
db.TransactionManager.AddNewlyCreatedDBObject(att, true);
}
btr.DowngradeOpen();
}
public static void AddAttsToBlocks(this ObjectId blockId, params AttributeDefinition[] atts)
{
blockId.AddAttsToBlocks(atts.ToList());
}
Aggiunge attributi alla definizione di blocco specificata. Possiamo usarlo in questo modo:
//属性添加
AttributeDefinition attr1 = new AttributeDefinition(Point3d.Origin, "箱变", "箱变编号", "请输入箱变编号", ObjectId.Null);
AttributeDefinition attr2 = new AttributeDefinition(Point3d.Origin + new Vector3d(0, 0.25, 0),
"变电站", "变电站编号", "请输入变电站编号", ObjectId.Null);
//然后将这两个属性加入到集合,再调用上面的方法即可。
La descrizione dei parametri è la seguente:
La definizione dei blocchi dinamici richiede l'utilizzo di blocchi di attributi.DynamicBlockReferencePropertyCollection
Le classi impongono vincoli sulle proprietà.
public void Insert()
{
Database db = HostApplicationServices.WorkingDatabase;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForRead);
BlockTableRecord space = db.CurrentSpaceId.GetObject(OpenMode.ForWrite) as BlockTableRecord;
//判断名为“块1”的块是否存在
if(! bt["块1"].IsNull)
{
BlockReference br = new BlockReference(Point3d.Origin, bt["块1"]);
br.ScaleFactors = new Scale3d(2.0);//设置尺寸为原来2倍
space.AppendEntity(br);
trans.AddNewlyCreatedDBObject(br, true);
trans.Commit();
}
else
{
return;
}
}
}
L'entità dell'attributo nel riferimento al blocco è rappresentata dalla classe AttibuteReference nello spazio dei nomi DatabaseServices, che in realtà è un oggetto di testo a riga singola derivato dalla classe DBText. Per aggiungere attributi a un riferimento di blocco, attenersi alla seguente procedura:
/// <summary>
/// 插入带属性的参照快
/// </summary>
/// <param name="spaceId">空间的ID</param>
/// <param name="layer">块要加入的图层名</param>
/// <param name="blockName">快参照所属的快名</param>
/// <param name="postion">插入点</param>
/// <param name="scale">缩放比例</param>
/// <param name="rotateAngle">旋转角度</param>
/// <param name="attNameValues">属性名称与取值</param>
/// <returns></returns>
public static ObjectId InsertBlockrefence(this ObjectId spaceId, string layer, string blockName, Point3d postion, Scale3d scale, double rotateAngle, Dictionary<string, string> attNameValues)
{
// 获取数据库对象
Database db = spaceId.Database;
//以读的方式打开块表
BlockTable bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
//如果没有blockName d的块,则程序返回
if (!bt.Has(blockName))
return ObjectId.Null;//如果没有blockName的块,程序返回
//以写的模式打开空间
BlockTableRecord space = (BlockTableRecord)spaceId.GetObject(OpenMode.ForWrite);
//获取块表的记录ID
ObjectId btrId = bt[blockName];
//打开块表记录
BlockTableRecord record = btrId.GetObject(OpenMode.ForRead) as BlockTableRecord;
//创建一个快参照并设置插入点
BlockReference br = new BlockReference(postion, bt[blockName]);
br.ScaleFactors = scale;
br.Layer = layer;
br.Rotation = rotateAngle;
space.AppendEntity(br);
//判断块表记录是否包含属性定义
if (record.HasAttributeDefinitions)
{
//若包含,则遍历属性定义
foreach (ObjectId id in record)
{
//检查是否是属性定义
AttributeDefinition attDef = id.GetObject(OpenMode.ForRead) as AttributeDefinition;
if (attDef != null)
{
//创建一个新的属性对象
AttributeReference attribute = new AttributeReference();
//从属性定义获取属性对象的对象特性
attribute.SetAttributeFromBlock(attDef, br.BlockTransform);
attribute.Rotation = attDef.Rotation;
attribute.Position = attDef.Position.TransformBy(br.BlockTransform);
attribute.AdjustAlignment(db);
//判断是否包含指定的属性名称
if (attNameValues.ContainsKey(attDef.Tag.ToUpper()))
{
//设置属性值
attribute.TextString = attNameValues[attDef.Tag.ToUpper()].ToString();
}
// 向块参照添加属性对象
br.AttributeCollection.AppendAttribute(attribute);
db.TransactionManager.AddNewlyCreatedDBObject(attribute, true);
}
}
}
db.TransactionManager.AddNewlyCreatedDBObject(br, true);
return br.ObjectId;//返回添加的快参照的ID
}
Alcuni dei parametri sopra indicati potrebbero non essere necessari, come il rapporto di scala e il rapporto di inserimento.
/// <summary>
/// 更新属性名称与取值
/// </summary>
/// <param name="blockRefId"></param>
/// <param name="attNameValues"></param>
public static void UpdateAttributesInBlock(this ObjectId blockRefId, Dictionary<string, string> attNameValues)
{
BlockReference blockRef = blockRefId.GetObject(OpenMode.ForRead) as BlockReference;
if (blockRef != null)
{
foreach (ObjectId id in blockRef.AttributeCollection)
{
AttributeReference attref = id.GetObject(OpenMode.ForRead) as AttributeReference;
if (attNameValues.ContainsKey(attref.Tag.ToUpper()))
{
attref.UpgradeOpen();
//设置属性值
attref.TextString = attNameValues[attref.Tag.ToUpper()].ToString();
attref.DowngradeOpen();
}
}
}
}